Чем == отличается от === в JavaScript?
- Что такое приведение типов в JavaScript?
- Почему NaN !== NaN?
=== — строгое сравнение: типы должны совпадать, без преобразований. == — нестрогое: перед сравнением приводит типы по запутанным правилам ("1" == 1, 0 == "", null == undefined — всё true). Используют ===; единственная распространённая идиома с == — x == null (null или undefined).
- Объекты сравниваются по ссылке — {} === {} это false
- NaN не равен ничему, даже себе — Number.isNaN
- Object.is отличает +0 от −0 и считает NaN равным NaN
А ещё Линтеры (eqeqeq) запрещают == в проекте
Подробно
Примеры приведения при ==:
"1" == 1 // true — строка в число
0 == "" // true — "" в 0
0 == "0" // true
"" == "0" // false — сравнение строк, транзитивности нет!
false == "0" // true
null == undefined // true
null == 0 // false
[] == false // true — [] → "" → 0
Правила (Abstract Equality) зависят от пары типов: булево приводится к числу, строка к числу, объект к примитиву через valueOf/toString. Отношение даже не транзитивно — поэтому == избегают.
NaN. По стандарту IEEE 754 NaN не равен ничему. Проверка — Number.isNaN(x) (глобальный isNaN сначала приводит к числу: isNaN("abc") — true).
Объекты сравниваются по ссылке. Глубокое сравнение — вручную или библиотекой (lodash isEqual).
Что хотят услышать
- Строгое и нестрогое сравнение.
- Примеры приведения.
- NaN и сравнение объектов.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗=== приводит типы перед сравнением, а == сравнивает строго
- ✓=== сравнивает без приведения типов, == приводит; исключение — идиома x == null
- ✗"1" === 1 возвращает true, потому что строка приводится к числу перед сравнением
- ✗Два одинаковых по содержимому объекта равны по ===
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.