Оператор идентичности (===
) ведет себя идентично оператору равенства (==
), за исключением того, что преобразование типа не выполняется, и типы должны быть одинаковыми, чтобы считаться равными.
Ссылка: Javascript Tutorial: Операторы сравнения
Оператор ==
будет сравнивать для равенства после выполнения любых необходимых преобразований типа . Оператор ===
не будет выполнять преобразование, поэтому, если два значения не совпадают, ===
просто вернет false
.
Чтобы проголосовать за отличный Douglas Crockford: Хорошие части ,
JavaScript имеет два набора операторов равенства:
===
и!==
, и их злых близнецов==
и!=
. Хорошие работают так, как вы ожидали. Если два операнда одного типа и имеют одинаковое значение, то===
создаетtrue
, а!==
производитfalse
. Злые близнецы поступают правильно, когда операнды одного типа, но если они имеют разные типы, они пытаются принудить ценности. правила, с помощью которых они делают, которые являются сложными и непреодолимыми. Вот некоторые из интересных случаев:'' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 // true
Отсутствие транзитивности вызывает тревогу. Мой совет - никогда не использовать злых близнецов. Вместо этого всегда используйте
===
и!==
. Все показанные сравнения производятfalse
с помощью оператора===
.Обновление:
Хорошая точка была поднята @Casebash в комментариях и в @Phillipe Laybaert's ответ относительно ссылочных типов. Для ссылочных типов
==
и===
действуют последовательно друг с другом (за исключением специального случая).var a = [1,2,3]; var b = [1,2,3]; var c = { x: 1, y: 2 }; var d = { x: 1, y: 2 }; var e = "text"; var f = "te" + "xt"; a == b // false a === b // false c == d // false c === d // false e == f // true e === f // true
Частным случаем является сравнение литерала с объектом, который оценивает тот же буквально, из-за его метода
toString
илиvalueOf
. Например, рассмотрим сравнение строкового литерала со строковым объектом, созданным конструкторомString
."abc" == new String("abc") // true "abc" === new String("abc") // false
Здесь оператор
==
проверяет значения двух объектов и возвращаетtrue
], но===
видит, что они не одного типа и возвращаютfalse
. Какой из них правильный? Это действительно зависит от того, что вы пытаетесь сравнить. Мой совет состоит в том, чтобы полностью обходить вопрос и просто не использовать конструкторString
для создания строковых объектов.Ссылка http://www.ecma-international.org/ecma-262 /5.1/#sec-11.9.3