Сравнение: и =, Object.is, NaN

↑ 1.4 JavaScript: основы · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: junior

Зачем это на собесе

Классика: чем == отличается от === и что делает 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().

Практика

  1. Составьте таблицу 8×8 результатов == для разных значений и сравните с ожиданиями.
  2. Реализуйте deepEqual для объектов и массивов.
  3. Найдите в коде == и решите, что заменить.

Вопросы с ответами

Связанные темы