为什么 0 < undefined return false 而不是 undefined?

Why does 0 < undefined return false instead of undefined?

为什么 0 < undefined return false 而不是 undefined?

根据 ES6 规范的抽象关系比较部分 http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-relational-comparison 我认为它应该 return 未定义。 (请点击规格以了解我在说什么)

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

然后在 6. 它说将 0 转换为一个数字,即 0 并将 undefined 转换为一个数字,根据 http://www.ecma-international.org/ecma-262/6.0/#sec-tonumber

应该是 NaN

既然 6f 声明 "If ny is NaN, return undefined" 那么为什么我得到的是 false 而不是 undefined?在 Chrome、Safari 和 Firefox 中的结果相同,所以我假设所有 3 种浏览器都没有错误地解释规范。

答案是您正在查看抽象关系比较操作的规范,而不是 < 运算符。

< 运算符的规范属于 ES6 中的关系运算符:http://www.ecma-international.org/ecma-262/6.0/#sec-relational-operators-runtime-semantics-evaluation

解释规范,< 运算符的工作方式如下:

  • 执行抽象关系比较
  • 如果 return 未定义,则 return false 否则 return 不管它 returns

因此规范中有一个硬编码部分将 undefined return 值从抽象关系比较操作转换为 false


注意:它在 ES7 中的指定方式相同:http://www.ecma-international.org/ecma-262/7.0/#sec-relational-operators-runtime-semantics-evaluation 所以它不会改变。另外,在 ES5 中也是这样指定的。