Операторы сравнения
Операторы сравнения
Строгое сравнение ===
=== сравнивает тип И значение — ничего не приводит:
1 === 1 // true
1 === '1' // false — разные типы
null === null // true
NaN === NaN // false — NaN не равен ничему, включая себя!
Нестрогое сравнение ==
== приводит типы перед сравнением. Результат часто неожиданный:
1 == '1' // true
0 == false // true
0 == '' // true
null == undefined // true — единственная пара
[] == false // true ([] → '' → 0, false → 0)
'' == false // true
Используйте
=== и !== по умолчанию. Исключение: value == null — удобная проверка на null ИЛИ undefined.Операторы отношения
5 > 3 // true
5 < 3 // false
5 >= 5 // true
5 <= 4 // false
// Строки сравниваются лексикографически (по Unicode)
'abc' < 'abd' // true — 'c' < 'd'
'B' < 'a' // true — 'B' (66) < 'a' (97)
'10' < '9' // true — строковое сравнение! '1' < '9'
// Смешанные типы — строка приводится к числу
'10' < 9 // false — 10 > 9
Сравнение с null и undefined
null > 0 // false
null == 0 // false
null >= 0 // true ← неожиданно!
// Причина: >= приводит null к 0, но == использует особое правило
// null == только null или undefined
undefined > 0 // false
undefined < 0 // false
undefined == 0 // false — undefined только == null
Избегайте сравнений
>, <, >=, <= с null и undefined. Поведение нелогично и часто приводит к багам.Алгоритм Abstract Equality Comparison из ECMAScript:
- Если типы одинаковые — используется ===
null == undefined→ trueundefined == null→ true- Если один number, другой string → string приводится к number
- Если один boolean → boolean приводится к number
- Если один object, другой primitive → вызывается ToPrimitive(object)
Именно поэтому [] == false:
[]→‘’(ToPrimitive)false→0‘’→00 === 0→ true