为什么“”< {}评价为真?

时间:2014-04-07 09:18:10

标签: javascript arrays string object compare

在JavaScript中,为什么:

"" < {}评估为true

"" < []评价为false

1 个答案:

答案 0 :(得分:6)

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

所有血腥的细节都是in the spec(公平警告,语言很温和)。


来自你的评论:

  

如果它首先尝试数字,请认为Number({})NaNNumber([])0。比较NaN < 0评估结果为false0 < NaN也是如此。为什么忽略这些结果?

当我最初说&#34; ...它首先尝试数字时,我把它放得很糟糕......&#34; (我已经更新了)。它没有。它只是更喜欢数字。再次详细说明了规范中的细节(上面的各种链接),但基本上是:

  • <操作对其操作数执行abtract ToPrimitive操作。
  • 对于对象,使用&#34;提示&#34;调用内部[[DefaultValue]]方法。 &#34;数&#34;
  • [[DefaultValue]](hint = Number)调用对象的valueOf方法,如果该方法返回一个原语,则返回它;如果结果不是原语,则[[DefaultValue]]会返回toString的结果。对象(包括数组)的valueOf方法返回原始对象,因此结果为[[DefaultValue]],返回toString的结果。
  • <操作看到操作数都是字符串并在词汇上进行比较。

如果操作数是原始数字,ToPrimitive将返回数字不变,而<将在数学上对它们进行比较;如果它们是Number个实例(请记住JavaScript同时具有数字,字符串和布尔值的原始版本和对象版本),Number#valueOf将调用[[DefaultValue]]Number#valueOf将返回<原始数值。因此{{1}}会以数学方式对它们进行比较。

有趣,嗯?