在JavaScript中,为什么:
"" < {}
评估为true
和
"" < []
评价为false
?
答案 0 :(得分:6)
因为<
强迫其论点。它更喜欢比较数字,但如果对象不支持数字原始值,它会执行字符串并最终进行词法比较。 String({})
为"[object Object]"
,但String([])
为""
。 "" < "[object Object]"
为true
,但"" < ""
为false
。
所有血腥的细节都是in the spec(公平警告,语言很温和)。
来自你的评论:
如果它首先尝试数字,请认为
Number({})
为NaN
而Number([])
为0
。比较NaN < 0
评估结果为false
,0 < NaN
也是如此。为什么忽略这些结果?
当我最初说&#34; ...它首先尝试数字时,我把它放得很糟糕......&#34; (我已经更新了)。它没有。它只是更喜欢数字。再次详细说明了规范中的细节(上面的各种链接),但基本上是:
<
操作对其操作数执行abtract ToPrimitive
操作。[[DefaultValue]]
方法。 &#34;数&#34; [[DefaultValue]]
(hint = Number)调用对象的valueOf
方法,如果该方法返回一个原语,则返回它;如果结果不是原语,则[[DefaultValue]]
会返回toString
的结果。对象(包括数组)的valueOf
方法返回原始对象,因此结果为[[DefaultValue]]
,返回toString
的结果。<
操作看到操作数都是字符串并在词汇上进行比较。如果操作数是原始数字,ToPrimitive
将返回数字不变,而<
将在数学上对它们进行比较;如果它们是Number
个实例(请记住JavaScript同时具有数字,字符串和布尔值的原始版本和对象版本),Number#valueOf
将调用[[DefaultValue]]
,Number#valueOf
将返回<
原始数值。因此{{1}}会以数学方式对它们进行比较。
有趣,嗯?