为什么在Javascript中,Number([]) === 0和Number({}) === NaN?

12
我看了一下http://zero.milosz.ca/上的第一个表格,想了解为什么例如0 == []0 != {}。我猜测这是因为Number([]) == 0Number({}) == NaN。然而,这部分似乎是随意的。为什么一个空列表是0而一个空对象是NaN呢?

3
数组就是这样奇怪。比如[[[[[[[[123]]]]]]]] == 123 - Niet the Dark Absol
@Kolink...但是这是什么原因让它起作用?(==的哪个规则,不在===中找到,正在被应用?) - user166390
1
@pst:如果操作数不是相同类型,则严格比较返回false(您可能已经知道)。但是,在这种情况下,==将将两个操作数转换为数字。 - Felix Kling
1
为什么标题使用 ===,但正文中使用 ==?问题实际上是在询问哪一个? - Redwood
显示剩余2条评论
3个回答

16

Number(some_object)会使用给定对象的字符串表示。对于你的示例,字符串表示如下:

js> ({}).toString();
[object Object]
js> [].toString();

js>
字符串'[object Object]'无法转换为数字,但空字符串''可以。

2
但是为什么空字符串 '' 会被转换成0呢? - tskuzzy
2
在数字上下文中使用时,假值通常会转换为0,这是相当普遍的。顺便说一下,空对象并不是假值。 - ThiefMaster
7
因为它被这样定义:“StringNumericLiteral的MV ::: [empty] 的值为0。”。请参阅http://es5.github.com/#x9.3.1。 - Felix Kling

9
为了更好地解释ThiefMaster的答案,我查阅了ECMAScript的规范
在将字符串转换为数字时,使用一种语法进行转换。特别地,StringNumericLiteral ::: [empty]的数学值被定义为0。实际上,任何空格都是0。

3
对于那些懒得在PDF中搜索的人,http://es5.github.com/#x9.3.1是规范中相关的部分。 - ThiefMaster

2
当一个值是对象([],{})而另一个值是数字或字符串时,操作符==会使用内置的转换方法将对象转换为原始值(在这种情况下是数字),所有Javascript对象都继承了这些方法:toString()valueOf()
对于像{}这样的通用对象,使用valueOf,默认情况下它返回对象本身,即!= 0。
对于内置数组,使用toString。应用于数组的该方法返回一个包含所有元素以逗号分隔的字符串。对于空数组,它返回一个空字符串''。
然后解释器将valueOf应用于该字符串;对于空字符串,该方法的返回值为0,因此[] == 0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接