我理解当声明变量时,它被赋予值“undefined”,但我不明白为什么以下代码不起作用(返回NaN):
function sum() {
// return the sum of all arguments given.
var answer;
for (var i = 0; i<arguments.length; i++){
answer += (arguments[i]);
}
console.log(answer);
}
sum(4,5,3,2);
为了得到正确答案(14),我必须初始化答案变量:
var answer = 0;
答案 0 :(得分:2)
简单地说:你不能添加到“undefined”。答案是......未定义,或者不是数字。但是,你可以加零,所以当然你必须将变量初始化为0。
答案 1 :(得分:1)
从本质上讲,你问为什么undefined + 5 + 4 + 3 + 2
是NaN
(不是数字)。答案是,当您将undefined
视为数字时,它会隐式转换为NaN
。 NaN
上的任何操作都会导致NaN
。
答案 2 :(得分:0)
answer += (arguments[i]);
等于
answer = answer + (arguments[i])
answer
最初未定义,你实际上有
answer = undefined + (arguments[i])
这是一个NaN:
alert(undefined + 42);
&#13;
答案 3 :(得分:0)
因为你试图在未定义的变量中添加一个数字,所以这是不可能的,因为你试图在你初始化之前添加一个数字来回答不是数字。
答案 4 :(得分:0)
未初始化答案等同于
var answer = undefined;
由于(未定义+任何数字)也是NaN(不是数字),每个循环都不做任何事情,只是保持对NaN的重新分配答案
console.log(undefined + 0); => NaN
console.log(NaN + 1); => NaN
console.log(NaN + 2); => NaN
答案 5 :(得分:0)
在控制台中尝试undefined + 1
(未初始化的变量解析为undefined
):其结果为NaN
(非数字),因此任何下一次迭代NaN
+一些数字将是NaN
。
或者,您可以使用Array.reduce
(有关详情,请参阅MDN)来计算总和:
function sum() {
// return the sum of all arguments given.
return ([].slice.call(arguments)).reduce(function (a, b) {
return a + b;
});
}
document.querySelector('#result')
.innerHTML = '<code>sum(1,4,3,5,6)</code> => ' + sum(1, 4, 3, 5, 6);
<div id="result"></div>