当我运行这个程序时,我最终得到 NaN ;我希望得到某种形式的解释,因为我很困惑!我有一种奇怪的感觉,它必须在范围内做一些事情......
https://jsfiddle.net/Smuggles/evj46a23/
var array = []
var range = function(start, end) {
for (var count = start; count <= end; count++) {
array.push(start);
start += 1;
}
console.log(array);
}
var sum = function() {
var result = 0
var arrayLength = array.length
for (var count = 0; count <= arrayLength; count++) {
result += array[count]
console.log(result);
}
}
console.log(sum(range(1, 10)));
最佳答案
两件事:
- 您需要更改
for
在sum
中循环函数为< arrayLength
而不是<= arrayLength
。您正在处理以 0 索引开头的数组长度。 - 您需要从
sum
返回结果功能
var array = [];
var range = function(start, end) {
for (var count = start; count <= end; count++) {
array.push(start);
start += 1;
}
};
var sum = function() {
var result = 0;
var arrayLength = array.length;
for (var count = 0; count < arrayLength; count++) {
result += array[count];
}
return result;
};
console.log(sum(range(1, 10)));
给定一个数组 [4,5,6]
,索引如下:
0: 4
1: 5
2: 6
因此,当您使用数组的 length 属性 ( 3
) 时,您将引用一个不存在的索引,该索引将返回 undefined
。它尝试对未定义的值进行数学计算,这会导致 NaN
。这就是为什么你必须使用 < arrayLength
.
函数式方法:
这将有助于使这些函数更加“纯粹”。无需在函数外部维护状态(使用 var array = []
),只需从函数返回值即可:请参阅以下示例:
function range(start, end) {
var arr = [];
for (var i = start; i <= end; i++) {
arr.push(i);
}
return arr;
}
function sumArray(array) {
return array.reduce(function(a, b) {
return a + b;
});
}
console.log(sumArray(range(1, 10)));
每个函数都接受参数,并简单地返回结果。这样,您就可以更加“实用”地处理这个问题。
关于JavaScript 循环结束 NaN 用于数字加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41819702/