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.
Это мой первый пост в блоге, дайте мне знать, если объяснений недостаточно.