Cracking JavaScript Interview: двойное равно против тройного равного

Один из первых вопросов на собеседовании по javascript: «В чем разница между двойным и тройным равенством?»

Концепция:

Javascript имеет три оператора сравнения.

оператор сравнения возвращает логическое значение после оценки результата сравнения.

выражение1 оператор сравнениявыражение2

Относительный( ‹, ›, ‹=, ›= )

Равенство ( ==, != )

Если оба выражения относятся к разным типам, оператор равенства пытается преобразовать их в строку, число или логическое значение.

«2» == 2 ; возвращает истину

Идентификация( ===, !== )

Если оба выражения имеют разные типы, оператор равенства не пытается преобразовать их в строку, число или логическое значение.

«2» == 2 ; возвращает ложь



Использование оператора == (Равенство)

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

Использование оператора === (Идентификация)

true === 1; //false
"2" === 2;  //false

Это связано с тем, что оператор равенства == выполняет приведение типов, а это означает, что интерпретатор неявно пытается преобразовать значения перед сравнением.

С другой стороны, оператор идентификации === не выполняет приведение типов и, следовательно, не преобразует значения при сравнении и, следовательно, работает быстрее.

Интересное графическое представление сравнения равенства между == и ===.

Источник: http://dorey.github.io/JavaScript-Equality-Table/

var1 === var2

При использовании === для проверки равенства JavaScript все остается как есть. Ничто не конвертируется до оценки.

var1 == var2

При использовании == для проверки равенства JavaScript происходят некоторые странные преобразования.

Мораль истории:

Используйте ===, если вы полностью не понимаете конверсии, которые происходят с ==.

Согласно спецификации: http://www.ecma-international.org/publications/standards/Ecma-262.htm

ECMA-262 — это спецификация языка сценариев, диалектом которого является JavaScript.

11.9.6 Алгоритм сравнения строгого равенства
Сравнение x === y, где x и y — значения, дает true или false. сильный>. Такое сравнение выполняется следующим образом:
1. Если Type(x) отличается от Type(y), вернуть false.
2. Если Type(x) не определено , вернуть true.
3. Если Type(x) равно Null, вернуть true.
4. Если Type(x) не является числом, перейдите к шагу 11.
5. Если x равно NaN, верните false.
6. Если y равно NaN , вернуть false.
7. Если x равно числовому значению, что и y, вернуть true.
8. Если x равно +0, а y равно −0, вернуть true.
9. Если x равно −0, а y равно +0, вернуть true.
10. Вернуть false.
11. Если Type(x) — String, вернуть true, если x и y — точно такая же последовательность символов (одинаковая длина и одинаковые символы в соответствующих должности); в противном случае вернуть false.
12. Если Type(x) имеет логическое значение, вернуть true, если x и y оба true или оба false; в противном случае вернуть false.
13. Вернуть true, если x и y относятся к одному и тому же объекту или если они относятся к объектам, соединенным друг с другом (см. 2). В противном случае верните false.

Это мой первый пост в блоге, дайте мне знать, если объяснений недостаточно.