Сравнение null и undefined с логическими значениями в Javascript

Согласно разделу 11.9.3 ES5, говорится что

Если Type(x) имеет логическое значение, вернуть результат сравнения ToNumber(x) == y.
Если Type(y) является логическим значением, вернуть результат сравнения x == ToNumber(y).

Когда я попытался сравнить

let a = null, b = null;

a == false; // false
b == false; // false
a == "";    // false
b == "";    // false
a == 0;     // false
b == 0;     // false

Что я ожидал здесь, для a == false, возвращающего false, так это то, что false приводится к Number, который равен 0, поэтому сравнение становится a == 0, а затем для следующего принуждения, который имеет тип null == 0, null должен быть приведен к Number, который равен 0. Итак, наконец, он должен вернуть true для 0 == 0.

Что я получил от ES5 11.9.3, так это

Если x равно null, а y не определено, вернуть true.
Если x не определено, а y равно null, вернуть true.

Упоминается о null и undefined.

В 10-м пункте раздела ES 11.9.3 говорится, что если ваше сравнение не соответствует 9 критериям выше return false.

Возвращает ли мое сравнение false согласно 10-му пункту в ES5 11.9.3, или я что-то здесь упускаю>


person Akshay Bande    schedule 03.11.2019    source источник
comment
which is of type null == 0, null should get coerced to Number which is 0. Но null не имеет логического типа.   -  person Code Maniac    schedule 03.11.2019
comment
Возвращает ли мое сравнение false согласно 10-му пункту в ES5 11.9.3 - да, я так думаю. Но нет никакого принуждения к 0, по крайней мере, насколько я мог видеть. Как вы упомянули, все точки не работают. PS: я не вижу причин использовать здесь ES5 (вы даже пометили его как ES6?!), так почему бы не спецификация ES2020?   -  person ASDFGerte    schedule 03.11.2019
comment
О каком конкретном сравнении вы спрашиваете? Вы всегда говорите только о a == false, так зачем показывать все остальные?   -  person T.J. Crowder    schedule 03.11.2019
comment
Мне просто было интересно узнать о нулевых сравнениях, поэтому я упомянул все рассматриваемые нулевые сравнения.   -  person Akshay Bande    schedule 03.11.2019


Ответы (1)


По сути, да, вы правы в том, что получаете false при сравнении null с чем-либо, кроме null или undefined, потому что вы переходите к последнему шагу алгоритма, а именно return false.

Если вы спросите, почему null == false — это false, короткий ответ таков: потому что null — это только == null и undefined.

Длинный ответ находится в абстрактной операции равенства, на которую вы указали, вот последняя версия: https://tc39.es/ecma262/#sec-abstract-equality-comparison Шаги 1–8 не применяются, но шаг 9 применяется:

  1. Если Type(y) имеет логическое значение, вернуть результат сравнения x == ! ToNumber(y).

(! перед ToNumber не является отрицанием, это аннотация спецификации о внезапных завершениях. Иногда это сбивает людей с толку.)

Итак, теперь у нас есть null == 0. Ни один из шагов 1–12 не применяется, поэтому применяется return false в шаге 13.

(Следует отметить, что "Если Type(x) is Object" на шаге 11 неверно, когда x равно null, даже если typeof null равно "object". Операция с типом отличается от typeof, Type(null) — это Null.)

В комментарии вы сказали:

Мне просто было интересно узнать о нулевых сравнениях, поэтому я упомянул все рассматриваемые нулевые сравнения.

Да, вы правы, вы доходите до конца. Единственные части алгоритма, относящиеся к null, — это шаги 2 и 3, которые проверяют, является ли один операнд null, а другой — undefined, и возвращают true, если это так.

person T.J. Crowder    schedule 03.11.2019