【问题标题】:Why does 0 < undefined return false instead of undefined?为什么 0 < undefined 返回 false 而不是 undefined?
【发布时间】:2017-02-23 03:53:40
【问题描述】:

为什么0 &lt; undefined 返回false 而不是未定义?

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

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

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

既然 6f 声明“如果 ny 是 NaN,则返回未定义”,那么为什么我会得到错误而不是未定义? Chrome、Safari 和 Firefox 的结果相同,所以我假设所有 3 种浏览器都没有对规范进行错误的解释。

【问题讨论】:

  • FWIW 0 &lt; NaN === false0 &gt; NaN === false。我的猜测是 &lt;&gt; 运算符返回一个布尔结果,它是 truefalseundefined 不仅不是一个值(它是一个变量),而且也不在集合中布尔值
  • 顺便说一句,最新的规范是ECMAScript 2016,它是 ed 7。今年年中 ECMAScript ed 8 aka 2017 将发布。

标签: javascript comparison-operators


【解决方案1】:

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

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

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

  • 执行抽象关系比较
  • 如果返回 undefined 则返回 false 否则返回任何返回值

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


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

【讨论】:

猜你喜欢
  • 2021-06-04
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多