为什么 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 中也是这样指定的。
为什么 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 中也是这样指定的。