为什么新的String * 1在Javascript中返回0?

时间:2016-05-25 13:47:56

标签: javascript

在JavaScript中,原因是:

new String * 1
<- 0

究竟是什么让它返回0,为什么以下内容等于NaN

function Foo() { this.bar = 0; }
new Foo * 5;
<- NaN

3 个答案:

答案 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,则应在结果中看到原始值

相关问题