为什么 “” < {} 的计算结果为 true
Why does "" < {} evaluate to true?
在JavaScript中,为什么:
"" < {}
评估到true
和
"" < []
评估false
?
因为<
强制其论点。它更喜欢比较数字,但如果对象不支持数字基元值,它会执行字符串,您最终会进行词法比较。 String({})
是"[object Object]"
,但String([])
是""
。 "" < "[object Object]"
是true
,但"" < ""
是false
。
所有血腥的细节都在规范中(公平警告,语言委婉地说是生硬的)。
从您的评论中:
如果它首先尝试数字,则认为
Number({})
NaN
,Number([])
0
。将NaN < 0
的计算结果与false
进行比较,0 < NaN
也是如此。为什么忽略这些结果?
当我最初说"......它首先尝试数字..." (我已经更新了)。其实不然。它只是更喜欢数字。同样,规范中的完整细节(上面的各种链接),但基本上:
<
操作对其操作数执行减法ToPrimitive
操作。- 对于对象,使用"提示"数字"调用内部
[[DefaultValue]]
方法。 -
[[DefaultValue]]
(hint = Number)调用对象的valueOf
方法,如果该方法返回基元,则返回它;如果结果不是基元,则[[DefaultValue]]
返回toString
的结果。对象(包括数组)的valueOf
方法返回原始对象不变,因此结果[[DefaultValue]]
返回toString
的结果。 <
操作看到操作数都是字符串,并按词法比较它们。
而如果操作数是基元数,ToPrimitive
将返回不变的数字,<
将以数学方式比较它们;如果它们是Number
实例(记住JavaScript有数字,字符串和布尔值的原始版本和对象版本),Number#valueOf
将由[[DefaultValue]]
调用,Number#valueOf
返回基元数字值。因此,<
会从数学上比较它们。
好玩吧?
相关文章:
- if(foo!==null)的计算结果为true,即使foo为null
- ngIf的计算结果始终为true
- 设置为负数的变量计算结果为true
- 如何在模态助推器中显示计算结果(JS)
- 将javascript计算结果自动放入HTML表单中
- JavaScript/jQuery:格式化日期计算结果的最佳方式
- 使用AngularJS从服务器获取计算结果
- 如果ng-if的计算结果为false,AngularJS会使我的模型数据无效
- 计算结果Javascript中不同数字的数量
- javascript/html获胜't显示计算结果
- 使正数的计算结果为真,使负数计算为假
- Javascript 无法计算结果
- 为什么 {} == false 的计算结果为 false,而 [] == false 的计算结果为 true
- 以 HTML 格式显示计算结果 (javascript)
- 如果 x = 3 且 z 未分配,为什么 z = x-- - --x 的计算结果为 2
- 为什么 _=$=+[],++_+''+$ 的计算结果为 10
- 如何使用 ng-class 在值计算结果为零时删除类
- 为什么Number.MIN_VALUE < -1219312(或任何小值)的计算结果为 false
- 为什么空的 JavaScript 数组在条件结构中的计算结果为 true
- JavaScript 中的计算结果与 Java 中的计算结果不同