javascript - 为什么我的基于 reduce 的平均函数返回 NaN?

标签 javascript arrays math prototype

尝试获取数组的平均值。

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 时需要考虑以下两点。

  1. reduce接受第二个参数,表示要使用的初始值。尽可能具体说明。

  2. 传递给 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/

相关文章:

javascript - 如何从 for 循环的每次迭代返回值

javascript - reactJS 在系统范围内禁用 console.log

arrays - 在 Cosmos DB 中查询嵌套数组

c# - 在 Array 类上使用 Linq 扩展

c# - 如何将 float 舍入到最接近的 n 倍数?

math - 除两个以外的其他基数是否存在格雷码?

sql - 为每个用户选择随机的非重复行

javascript - Chrome扩展消息队列

javascript - 即使 props 显示正确,使用 PropTypes 进行类型检查也会出现错误

arrays - Matlab - 从矩阵中删除包含0的行和列