数组范围的总和(回调函数)

时间:2015-06-10 06:59:50

标签: javascript arrays

此代码有什么问题?

function range(start, end){
  var arrayRange = [];
  for(i= start; i<=end; i++){
    arrayRange.push(i)
  }
  return(arrayRange);
}
var r = range(1,10);
console.log(r);

function sumRange(sumArray){
  var total = 0;

 for(var i=0; i <= sumArray.length; i++){
   total = total + sumArray[i];   
 }
  return total;
}

var s=sumRange(r);
console.log(s);

这是在控制台中显示的内容。

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
NaN

我正在尝试使用Eloquent Javascript来练习回调函数。我的目标是制作这个

console.log(sum(range(1,10)));
// 55 

2 个答案:

答案 0 :(得分:3)

问题是i <= sumArray.length,数组索引从0到length -1所以循环条件应为i < sumArray.length

在你的情况下,循环的最后一次迭代将是total + undefined,它将返回NaN

function sumRange(sumArray) {
    var total = 0;
    for (var i = 0; i < sumArray.length; i++) {
        total = total + sumArray[i];
    }
    return total;
}

你可以使用像

这样的Array.reduce()
function sumRange(sumArray) {
    return sumArray.reduce(function (sum, val) {
        return sum + val;
    }, 0);
}

答案 1 :(得分:1)

在sum函数的这一部分:

for(var i=0; i <= sumArray.length; i++){
  total = total + sumArray[i];   
}

因为您的条件是i <= sumArray.length而不是i < sumArray.length,所以您尝试访问尚未设置的数组索引。执行此操作时,JavaScript将生成undefined作为值,undefined添加到任何数字后,将生成NaN

NaN值基本上是JavaScript让您知道计算中出现问题的方式,而实际上没有足够的帮助告诉您 它出错了。即使严格模式也不会修改此行为,因此在使用数组时必须小心,以避免访问未定义的键。顺便说一下,当您尝试访问未定义的对象键时,存在相同的行为(在JavaScript中,数组只是对象的特殊情况)。

回想一下,JavaScript的数组是零索引的,即具有n元素的数组将具有索引键0..n-1,因此您希望迭代直到数组的长度非 - 包含使用条件

i < sumArray.length。一旦这个条件为假,你就想停止迭代,因为你处于未定义的区域。