Javascript声明并初始化变量

时间:2014-12-01 16:39:56

标签: javascript variables

我理解当声明变量时,它被赋予值“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;

6 个答案:

答案 0 :(得分:2)

简单地说:你不能添加到“undefined”。答案是......未定义,或者不是数字。但是,你可以加零,所以当然你必须将变量初始化为0。

答案 1 :(得分:1)

从本质上讲,你问为什么undefined + 5 + 4 + 3 + 2NaN(不是数字)。答案是,当您将undefined视为数字时,它会隐式转换为NaNNaN上的任何操作都会导致NaN

答案 2 :(得分:0)

answer += (arguments[i]);

等于

answer = answer + (arguments[i])

answer最初未定义,你实际上有

answer = undefined + (arguments[i])

这是一个NaN:

&#13;
&#13;
alert(undefined + 42);
&#13;
&#13;
&#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> =&gt; ' + sum(1, 4, 3, 5, 6);
<div id="result"></div>