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

时间:2012-06-21 18:39:54

标签: javascript

我正在查看http://zero.milosz.ca/上的第一个表,并希望了解为什么,例如0 == []0 != {}。我假设是因为Number([]) == 0Number({}) == NaN。但是,这部分似乎是武断的。为什么空列表0和空对象为NaN

3 个答案:

答案 0 :(得分:16)

使用Number(some_object)将使用给定对象的字符串表示形式。对于您的示例,字符串表示形式为:

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

js>

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

答案 1 :(得分:9)

详细说明一下ThiefMaster的答案,我已经看了一下ECMAScript的specifications

将字符串转换为数字时,语法用于转换。特别是,StringNumericLiteral ::: [empty]的数学值定义为0.实际上,任何空格都为0。

答案 2 :(得分:2)

当一个值是一个对象([],{})而另一个是数字或字符串时,operator ==使用内置的转换方法将对象转换为原始值(在本例中为数字) Javascript中的所有对象都继承: toString() valueOf()

对于{}之类的通用对象,使用 valueOf ,默认情况下它返回对象本身,即!= 0。

对于内置数组,使用 toString 。应用于数组的此方法返回包含由逗号连接的所有元素的字符串。对于空数组,它返回一个空字符串''。

然后解释器将 valueOf 应用于该字符串;对于空字符串,此方法的返回值为0,因此[] == 0。