Разница между == и ===?

JuniorJavaScript #javascript #operators

Вопрос

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

Короткий ответ

=== (строгое равенство) сравнивает значения без приведения типов — типы должны совпадать. == (нестрогое равенство) перед сравнением приводит операнды к одному типу, что часто даёт неожиданные результаты.

Подробный ответ

=== сначала проверяет тип операндов: если типы разные — результат сразу false, никакого приведения не происходит. Если типы совпадают, сравнение идёт как обычно (числа/строки/булевы значения — по значению, объекты — по ссылке).

== перед сравнением выполняет приведение типов (type coercion) по довольно запутанным правилам спецификации: например, при сравнении числа со строкой строка приводится к числу, null равен undefined (но больше ничему), объект приводится к примитиву через valueOf/toString.

Из-за неочевидных правил приведения ('' == 0, [] == false, '0' == false) практически везде в современном коде рекомендуется использовать ===/!==, а == — только для намеренной проверки value == null (которая одновременно ловит и null, и undefined).

Пример

0 == '0'        // true — строка приводится к числу
0 == ''         // true — пустая строка приводится к 0
0 == '\n'       // true — пробельная строка приводится к 0
false == 'false' // false — строка непустая, приводится к NaN
null == undefined // true — специальное правило
null === undefined // false — разные типы

1 === 1          // true
1 === '1'        // false — разные типы, приведения нет

// Единственный оправданный случай использования ==
function isNullish(value) {
  return value == null // ловит и null, и undefined
}

Дополнительные вопросы

  • Почему NaN === NaN даёт false и как правильно проверить значение на NaN?
  • Как == сравнивает объект и примитив (например, [1] == 1)?
  • Чем Object.is отличается от ===?