2017-02-23 150 views
0

为什么0 < undefined返回false而不是未定义?为什么0 <undefined返回false而不是undefined?

基础上ES6规范http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-relational-comparison的抽象关系比较部分,我认为它应该返回undefined。 (请点击规格明白我在说什么)

我并不完全了解ReturnIfAbrupt一部分,但它似乎并不像应该停止比较。然后我把3和4解释为基本上说,因为它使用了一个<标志,而不是一个>标志,然后继续下去。它应该忽略5,因为0和undefined都不是字符串。

所以后来就6.它说,0转换为数字,即0和未定义转换为数字应为NaN按照http://www.ecma-international.org/ecma-262/6.0/#sec-tonumber

自从1207美国“纽约如果是NaN,返回undefined “那么我为什么会得到错误而不是不确定?在Chrome,Safari和Firefox中的结果是相同的,所以我假设所有3个浏览器都不解释规范错误。

+0

FWIW'0 的NaN === FALSE'。我的猜测是''<' and '>运算符返回布尔结果要么是TRUE;或'FALSE'和'undefined'不仅不是一个值(它是一个变量),但也不能在一组布尔 – slebetman

+0

的BTW,最新的规范是[* ECMAScript 2016 *](http://www.ecma-international.org/ecma-262/7.0/index.html),它是ed 7.在今年年中ECMAScript ed 8 aka 2017将会被释放。 – RobG

回答

2

答案是,你正在寻找的抽象关系比较操作的规范,但不是<操作。

<运营商的规范落在下关系运算ES6:http://www.ecma-international.org/ecma-262/6.0/#sec-relational-operators-runtime-semantics-evaluation

复述此规范,<运营商的工作原理如下:

  • 如果返回执行摘要关系比较
  • 未定义则返回false,否则返回无论它返回

因此,有规范的硬编码部分从抽象关系比较操作undefined返回值转换为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