此代码有什么问题?
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
答案 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
。一旦这个条件为假,你就想停止迭代,因为你处于未定义的区域。