尝试获取数组的平均值。
Array.prototype.average = function() {
var sum = 0;
this.reduce(function(a, b) {
sum = a + b;
});
return sum / this.length;
};
[2, 15, 7].average();
为什么 average
函数调用返回 NaN
?
最佳答案
您的程序没有运行,因为 a
具有前一个函数调用的累积值。第一次,将使用数组的前两个值。所以 sum
将变成 17
(2 + 15
)。由于您没有从该函数返回任何内容,因此默认情况下将返回 undefined
,并将在下一次调用中将其用作 a
的值。所以,评价是这样的
a: 2, b: 15 => 17
a: undefined, b: 7 => NaN
因此,sum
将有 NaN
,因为 undefined + 7
使它如此。 NaN
上的任何数字运算,总是会得到 NaN
,这就是为什么 NaN/this.length
会得到 NaN
>。您可以修复您的程序,只需在调用函数时返回 sum
的当前值,以便在下一次函数调用时,a
将具有适当的累加值。
Array.prototype.average = function() {
var sum = 0;
this.reduce(function(a, b) {
sum = a + b;
return sum;
});
return sum / this.length;
};
但是我们在这里没有利用reduce
的强大功能和灵 active 。使用 reduce
时需要考虑以下两点。
reduce
接受第二个参数,表示要使用的初始值。尽可能具体说明。传递给
reduce
的函数中的第一个参数累积结果,最终将返回,利用它。无需使用单独的变量来跟踪结果。
这样你的代码看起来会更好
Array.prototype.average = function() {
var sum = this.reduce(function(result, currentValue) {
return result + currentValue
}, 0);
return sum / this.length;
};
console.log([2, 15, 7].average());
# 8
reduce
实际上是这样工作的。它遍历数组并将当前值作为第二个参数传递给函数,将当前累加结果作为第一个参数,函数返回的值将存储在累加值中。所以,求和其实是这样的
result: 0 , currentValue: 2 => 2 (Initializer value `0`)
result: 2 , currentValue: 15 => 17
result: 17, currentValue: 7 => 24
因为它用完了数组中的值,24
将作为 reduce
的结果返回,它将存储在 sum
中>.
关于javascript - 为什么我的基于 reduce 的平均函数返回 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28392475/