2017-02-23 9 views
0

Почему 0 < undefined возвращает false вместо не определено?Почему 0 <undefined возвращает false вместо undefined?

Основываясь на абстрактной части сравнения реляционных характеристик ES6 http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-relational-comparison Я думаю, что он должен возвращаться не определен. (пожалуйста, щелкните по спецификации, чтобы понять, что я говорю)

Я не совсем понимаю часть ReturnIfAbrupt, но, похоже, это не должно останавливать сравнение. Затем я интерпретировал 3 и 4, поскольку в основном говорю, поскольку он использует флаг <, а не флаг>, а затем продолжает двигаться. Он должен игнорировать 5, потому что 0 и undefined не являются строками.

Итак на 6. он говорит, чтобы преобразовать 0 до числа, которое 0 и преобразовать неопределенными в число которых должно быть NaN согласно http://www.ecma-international.org/ecma-262/6.0/#sec-tonumber

Поскольку 6f состояний «Если пу является NaN, возврат не определено «Тогда почему я становлюсь ложным, а не неопределенным? Это тот же результат в Chrome, Safari и Firefox, поэтому я предполагаю, что все 3 браузера не интерпретируют спецификацию неправильно.

+0

FWIW '0 NaN === false'. Я предполагаю, что оператор '<' and '>' возвращает логический результат, который является либо 'true', либо' false', а 'undefined' является не только NOT значением (это переменная), но также не находится в наборе булевых значений – slebetman

+0

BTW, последняя спецификация - [* ECMAScript 2016 *] (http://www.ecma-international.org/ecma-262/7.0/index.html), который издан в 7. В середине этого года ECMAScript ed 8 aka 2017 Будет выпущен. – RobG

ответ

2

Ответ заключается в том, что вы смотрите спецификацию операции реляционного сравнения, но не оператор <.

Спецификация оператора < подпадает под реляционные операторы в ES6: http://www.ecma-international.org/ecma-262/6.0/#sec-relational-operators-runtime-semantics-evaluation

Перефразируя спецификации, оператор < работает следующим образом:

  • Выполнение Аннотация Relational Сравнение
  • Если она возвращает undefined then return false в противном случае вернуть то, что он возвращает

Так есть жёстко часть спецификации, которая преобразует значение undefined возврата из операции Абстрактного Relational Сравнения с false


Примечания: Это указано так же, как в ES7: http://www.ecma-international.org/ecma-262/7.0/#sec-relational-operators-runtime-semantics-evaluation, так что это не изменится. Кроме того, это было указано и в ES5.

+0

Именно так с самого начала в [* ECMAScript ed 1 §11.8.1 *] (http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,% 201-й% 20edition,% 20June% 201997.pdf). ;-) – RobG