在JavaScript中,原因是:
new String * 1
<- 0
究竟是什么让它返回0
,为什么以下内容等于NaN
?
function Foo() { this.bar = 0; }
new Foo * 5;
<- NaN
答案 0 :(得分:10)
如果使用像*
这样的算术运算符,JavaScript会尝试将类型转换为数字。空字符串变为0
。
如果你有,例如:
new String("foo") * 1
您会注意到它返回NaN
,因为无法完成转换为数字。这就是你的第二种情况。
答案 1 :(得分:6)
使用算术运算符时,操作数将首先转换为数字。
在第一种情况下,在左侧表达式中,您有一个空字符串。根据规范中的section,空字符串在转换为数字时将变为0。
StringNumericLiteral为空或仅包含空格,将转换为+0。
由于new String
只是一个零字符的字符串对象,因此它是空的,这就是为什么你的第一个表达式被评估为零(0 * 1
)。
在第二种情况下,new Foo
返回无法转换为数字的对象。如果无法将对象转换为数字,则将返回NaN
。引用规范中的相同部分,
如果语法不能将String解释为StringNumericLiteral的扩展,则ToNumber的结果为NaN。
这就是为什么结果NaN
在这里(NaN * 5
)。
你可以自己查看这些东西。
console.log(+(new String()));
// 0
console.log(+{});
// NaN
答案 2 :(得分:1)
new String
返回String
个对象,其primitive value为""
""
解析为数字为0
。
所以当你new String * 1
时,就好像你做了0 * 1
。
您的Foo
对象未指定任何类型的原始值,因此无法为您执行此操作并获得NaN
如果在控制台中编写new String
,则应在结果中看到原始值