Разница между == и ===?
Вопрос
В чём разница между == и === в 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отличается от===?