Сравнение: и =, Object.is, NaN
↑ 1.4 JavaScript: основы · ← Предыдущая · → Следующая
Зачем это на собесе
Классика: чем
==отличается от===и что делаетObject.is.
Объяснение
| Оператор | Поведение |
|---|---|
=== (строгое) | без приведения типов: типы разные — false |
== (нестрогое) | с приведением типов по алгоритму Abstract Equality |
Object.is(a, b) | как ===, но NaN равен NaN, а +0 не равен -0 |
Array.includes | использует SameValueZero (NaN найдёт, +0 == -0) |
Правила ==:
null == undefined—true, и больше ни с чем не равны.- Число и строка → строка в число.
- Boolean → число (
true= 1). - Объект и примитив → объект в примитив.
0 == "0" // true
0 == "" // true
"0" == "" // false (нетранзитивно!)
null == 0 // false
null == undefined // true
NaN === NaN // false
Object.is(NaN, NaN) // true
Object.is(0, -0) // false
[1] == 1 // true
{} == {} // false (разные ссылки)Объекты сравниваются по ссылке: {a:1} === {a:1} — false. Глубокое сравнение — вручную, structuredClone + JSON.stringify (ограниченно) или библиотеки (lodash.isEqual).
Рекомендация: всегда ===. Исключение: x == null для проверки на null и undefined.
Нюансы и подводные камни
==нетранзитивно:"0" == false,false == "", но"0" != "".NaNпроверять черезNumber.isNaN/Object.is.-0в вычислениях:1 / -0 = -Infinity.switchиспользует строгое сравнение.- Сравнение дат:
date1 === date2— ссылки; используйтеgetTime().
Практика
- Составьте таблицу 8×8 результатов
==для разных значений и сравните с ожиданиями. - Реализуйте
deepEqualдля объектов и массивов. - Найдите в коде
==и решите, что заменить.
Вопросы с ответами
Чем
==отличается от===?
==приводит типы перед сравнением,===сравнивает без приведения.
Что делает
Object.is?Сравнивает как
===, но считаетNaNравнымNaNи различает+0и-0.
Когда
x == nullдопустимо?Когда нужно проверить одновременно
nullиundefined.