为什么""<{}评估为真?

Chi*_*iru 4 javascript arrays string compare object

在JavaScript中,为什么:

"" < {}评估true

"" < []评价到false

T.J*_*der 6

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

所有血淋淋的细节都在规范中(公平警告,语言很温和).


来自你的评论:

如果第一次尝试的数字,认为Number({})NaNNumber([])0.比较NaN < 0评估结果false,等等0 < NaN.为什么忽略这些结果?

当我最初说"......它首先尝试数字......"时(我已经更新了),我最初说得很糟糕.它没有.它只是喜欢数字.再次,详细说明中的详细信息(来自上面的各种链接),但基本上:

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

然而,如果操作数是原始数字,则ToPrimitive返回数字不变,并且<将在数学上对它们进行比较; 如果它们是Number实例(记住JavaScript有数字,字符串和布尔值的原始和对象版本),Number#valueOf将被调用[[DefaultValue]],并Number#valueOf返回原始数值.因此<,他们将以数学方式对它们进

好玩,嗯?