Операторы равенства == и ===
Строгое равенство ===
Сравнивает значение и тип без каких-либо преобразований.
1 === 1 // true
1 === "1" // false - разные типы
null === null // true
NaN === NaN // false ← исключение!
Нестрогое равенство ==
Перед сравнением приводит типы по алгоритму спецификации ES.
1 == "1" // true (строка → число)
0 == false // true (false → 0)
null == undefined // true ← особый случай
null == 0 // false ← null не приводится к числу
[] == false // true ([] → "" → 0, false → 0)
[] == ![] // true - знаменитый парадокс
Таблица коварных случаев
| Выражение | Результат |
|---|---|
null == undefined | true |
null === undefined | false |
NaN == NaN | false |
0 == -0 | true |
[] == [] | false (разные объекты) |
Object.is
Строже, чем ===: различает +0 и -0, корректно сравнивает NaN.
Object.is(NaN, NaN) // true
Object.is(0, -0) // false
Object.is(1, 1) // true
Рекомендация
Всегда используйте ===. Единственное исключение, где == читается лаконично: проверка на null/undefined одновременно:
if (value == null) {
// value равен null или undefined
}