Мне кажется, что операторы == и === работают одинаково. Например:
1 == 1 // true
1 === 1 // true
1 == 2 // false
1 === 2 // false
Оператор == короче и часто встречается в других языках программирования. Так зачем === вообще?
Мне кажется, что операторы == и === работают одинаково. Например:
1 == 1 // true
1 === 1 // true
1 == 2 // false
1 === 2 // false
Оператор == короче и часто встречается в других языках программирования. Так зачем === вообще?
Операторы === и !== являются операторами строгого сравнения. Значит, если операнды имеют разные типы, то не являются равными. Например:
1 === "1" // возвращает false
1 !== "1" // возвращает true
null === undefined // возвращает false
Операторы == и != являются операторами, скажем, грубого сравнения. То есть, если операнды имеют разные типы, JavaScript пытается как-то преобразовать их, чтобы стали сравнимыми. Например:
1 == "1" // возвращает true
1 != "1" // возвращает false
null == undefined // возвращает true
Интересно заметить, что в отличие от ===, оператор == не является транзитивным:
"0" == 0 // true
0 == "" // true
"0" == ""// false
Не очень легко помнить правила этого грубого сравнения, и иногда бывает, что оно работает неожиданным образом. Поэтому, я рекомендую использовать === вместо ==.
Даже я не помню мелкие детали оператора ==, так что посмотрим в спецификации, пункт 11.9.3:
Алгоритм сравнения абстрактного равенства
Сравнение x == y, где x и y являются значениями, возвращает true или false. Это сравнение производится следующим образом:
- Если Type(x) такой же, что и Type(y), то
- Если Type(x) – Undefined, вернуть true.
- Если Type(x) – Null, вернуть true.
- Если Type(x) – Number, то
- Если x – NaN, вернуть false.
- Если y – NaN, вернуть false.
- Если x имеет такое же числовое значение, что и y, вернуть true.
- Если x равно +0 и y равно −0, вернуть true.
- Если x равно −0 и y равно +0, вернуть true.
- Вернуть false.
- Если Type(x) – String, то вернуть true, если x и y имеют абсолютно одинаковую последовательность символов (одинаковой длины и с одинаковыми символами в соответствующих позициях). В противном случае вернуть false.
- Если Type(x) – Boolean, вернуть true, если x и y оба являются или true, или false. В противном случае вернуть false.
- Вернуть true, если x и y относятся к одному и тому же объекту. В противном случае вернуть false.
- Если x равно null и y – undefined, вернуть true.
- Если x – undefined и y – null, вернуть true.
- Если Type(x) – Number и Type(y) – String,
вернуть результат сравнения x == ToNumber(y).- Если Type(x) – String и Type(y) – Number,
вернуть результат сравнения ToNumber(x) == y.- Если Type(x) – Boolean, вернуть результат сравнения ToNumber(x) == y.
- Если Type(y) – Boolean, вернуть результат сравнения x == ToNumber(y).
- Если Type(x) – либо String, либо Number, и Type(y) – Object,
вернуть результат сравнения x == ToPrimitive(y).- Если Type(x) – Object и Type(y) –либо String, либо Number,
вернуть результат сравнения ToPrimitive(x) == y.- Вернуть false.
=== не нужно: например, в выражении typeof a === typeof b вполне достаточно ==. Да и ситуации, в которых есть уверенность в типе операндов, не так уж и редки.
– Regent
Jun 24 '15 at 07:02
===, чем каждый раз думать, "достаточно ли ==?"
– Peter Olson
Jun 24 '15 at 07:09
==вообще? – VladD Jul 04 '15 at 15:09