function sumArray(numbers){
var sum;
for(var i in numbers){
sum += numbers[i];
}
return sum;
}
console.log(sumArray([1,2,3,4,5]));
大家好
结果是 NaN。但是,如果我用 sum = 0 初始化总和,则结果为 15。为什么JS无法识别数组中的值类型并为我进行初始化?为什么在第一种情况下返回 NaN?
谢谢
当变量在当前范围内声明时,将使用undefined
值对其进行初始化。
var sum; // is initialized with undefined
在for
循环中,加法sum += numbers[i]
实际上是在执行undefined + 1
操作。由于这两个操作数都不是字符串类型,因此它们将转换为数字:
-
undefined
+ 1 -
NaN
+ 1 -
NaN
请查看本文,了解有关加法运算符的详细信息(示例 7)。
当然,要解决此问题,只需将其初始化为0:
var sum = 0;
此外,我会简单地总结这些项目:
var sum = [1,2,3,4,5].reduce(function(sum, item) {
return sum + item;
});
当你创建var sum;
它的值是未定义的[默认]
所以当你不断添加到未定义时,你会得到NaN
[不是数字]
但是如果你初始化为var sum=0;
然后您将数字添加到 0,以便获得正确的输出
尝试
console.log(undefined+1);
你得到 NaN 但是
如果你这样做
console.log(0+1);
然后你得到1
这是因为您尚未初始化sum
。所以sum+
会尝试添加到undefined
.
function sumArray(numbers){
var sum=0; // sum="" if you want output as 12345
for(var i in numbers){
sum += numbers[i];
}
return sum;
}
console.log(sumArray([1,2,3,4,5]));
斯菲德尔
背后的原因非常清楚。当 JavaScript 发现任何"未定义"或"意外"错误时,它会返回 NaN。
在您的第二个条件中,您添加了 sum=0 的其他地方,它已经产生了一个值,然后您所做的就是对该值的加法。