2

我正在尝试获取数组中所有数字的总和。我试图以最简单的方式来做,但总和显示 NAN。为什么会这样?请帮忙

var numbers = [45, 34, 12, 10, 8, 9];
var i;

for(i=0 ; i<numbers.length; i++){
  var sum = sum + numbers[i];
  //alert(sum);
}
document.getElementById("demo").innerHTML="The sum is" + sum;
<h2>JavaScript</h2>
<p>This example finds the sum of all numbers in an array:</p>
<p id="demo"></p>

4

5 回答 5

2

var sum = [1, 2, 3].reduce(add, 0);
function add(a, b) {
  return a + b;
}
console.log(sum); // 6

于 2018-10-07T08:47:06.803 回答
2

您正在sum为每个循环迭代创建一个新变量,并且您在声明它之前使用它,因此undefined + <some numer>给您NaN

var total = 0;
[45, 34, 12, 10, 8, 9].forEach(num => {total += num});

document.getElementById("demo").innerHTML=`The sum is: ${total}`;
<h2>JavaScript</h2>
<p>This example finds the sum of all numbers in an array:</p>
<p id="demo"></p>

此外,使用 for 循环很好的破解:

var total = 0;
var numbers = [45, 34, 12, 10, 8, 9];
for (var i = 0; i < numbers.length; total += numbers[i++]);

console.log('total', total);

于 2018-10-07T08:38:57.943 回答
1

问题是您在循环内声明了 sum 变量并且没有对其进行初始化。

所以你得到undefined + numbers[i]which equals NaN

var numbers = [45, 34, 12, 10, 8, 9];
var i;
var sum = 0;

for(i=0 ; i<numbers.length; i++){
sum = sum + numbers[i];
}

document.getElementById("demo").innerHTML="The sum is" + sum;
<p id="demo"></p>

于 2018-10-07T08:34:13.383 回答
1

问题在于它sum是在你的函数范围之外定义的,所以你实际上在做的是var sum = undefined + numbers[i](也就是NaN)。

即便如此,最好还是使用一个reduce或箭头函数(如果你可以使用 ES6)。

使用reduce()

var numbers = [45, 34, 12, 10, 8, 9],
    sum     = numbers.reduce(function(a, b) { return a + b; }, 0);
    
document.getElementById('output').innerHTML = sum;
<div id="output"></div>

使用箭头函数

var numbers = [45, 34, 12, 10, 8, 9],
    sum     = numbers.reduce((a, b) => a + b, 0);
    
document.getElementById('output').innerHTML = sum;
<div id="output"></div>

于 2018-10-07T08:37:35.013 回答
-1

您每次都在实例化 sum,将 var sum 从循环中取出并得到 sum。

您也可以使用 Array.prototype.reduce: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

于 2018-10-07T08:40:57.233 回答