JavaScript

В чём разница между == и ===?

Операторы равенства == и ===

Строгое равенство ===

Сравнивает значение и тип без каких-либо преобразований.

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 == undefinedtrue
null === undefinedfalse
NaN == NaNfalse
0 == -0true
[] == []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
}

Источники