Неопределенное и неопределенное сравнение
Мне любопытно узнать почему
null == undefined
возвращается true
но
null >= undefined
возвращается false
Разве включение оператора больше чем приводит к различным значениям?
2 ответа
TL; Dr The >=
заканчивает приведение обоих аргументов к числам в этом случае: undefined
принуждают к NaN
в то время как null
принуждают к 0
, которые не равны. За ==
спецификация явно определяет, что null == undefined
является true
,
Значения, фактически, приводятся в обоих случаях (в некотором смысле, по крайней мере, в случае с ==
это особенное). Давайте рассмотрим их по одному, с помощью спецификации.
Алгоритм для >=
Оператор использует "Абстрактный алгоритм реляционного сравнения", который используется другими реляционными операторами. Из описания в спецификации мы видим, что алгоритм делает следующее:
- Преобразует аргументы в примитивы (которые
null
а такжеundefined
уже есть). - Проверяет, если аргументы
String
с (что они не являются). - Если они не
String
s, алгоритм преобразует аргументы в числа (см. шаги 3.a. и 3.b.) и выполняет сравнение с результатами.
Последний пункт является ключом. От ToNumber
таблица, мы видим, что undefined
принуждают к NaN
и алгоритм учитывает любое сравнение с NaN
как ложь (см. шаги 3.c. и 3.d.). Таким образом, null >= undefined
является false
,
Для другого случая ==
На самом деле история намного проще: в спецификации прямо говорится, что null == undefined
истинно как часть "Алгоритма сравнения абстрактного равенства" (см. шаги 2. и 3.). Таким образом, null == undefined
является true
,
В JS ==
оператор приводит значения к одному типу для сравнения, поэтому 1=="1"
является true
, использование ===
оператор для точного сопоставления типов