为什么 “” < {} 的计算结果为 true

Why does "" < {} evaluate to true?

本文关键字:计算 结果 true 为什么      更新时间:2023-09-26

在JavaScript中,为什么:

"" < {}评估到true

"" < []评估false

因为<强制其论点。它更喜欢比较数字,但如果对象不支持数字基元值,它会执行字符串,您最终会进行词法比较。 String({})"[object Object]",但String([])"""" < "[object Object]"true,但"" < ""false

所有血腥的细节都在规范中(公平警告,语言委婉地说是生硬的)。


从您的评论中:

如果它首先尝试数字,则认为Number({}) NaNNumber([]) 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返回基元数字值。因此,<会从数学上比较它们。

好玩吧?