Неопределенное и неопределенное сравнение

Мне любопытно узнать почему

null == undefined

возвращается true но

null >= undefined

возвращается false

Разве включение оператора больше чем приводит к различным значениям?

2 ответа

Решение

TL; Dr The >= заканчивает приведение обоих аргументов к числам в этом случае: undefined принуждают к NaN в то время как null принуждают к 0, которые не равны. За ==спецификация явно определяет, что null == undefined является true,


Значения, фактически, приводятся в обоих случаях (в некотором смысле, по крайней мере, в случае с == это особенное). Давайте рассмотрим их по одному, с помощью спецификации.

Алгоритм для >= Оператор использует "Абстрактный алгоритм реляционного сравнения", который используется другими реляционными операторами. Из описания в спецификации мы видим, что алгоритм делает следующее:

  1. Преобразует аргументы в примитивы (которые null а также undefined уже есть).
  2. Проверяет, если аргументы Stringс (что они не являются).
  3. Если они не Strings, алгоритм преобразует аргументы в числа (см. шаги 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, использование === оператор для точного сопоставления типов

Другие вопросы по тегам