当我们传递一个带有一个参数的函数时,JavaScript 的 reduce 方法表现得很奇怪

Posted

技术标签:

【中文标题】当我们传递一个带有一个参数的函数时,JavaScript 的 reduce 方法表现得很奇怪【英文标题】:JavaScript reduce method behaving strangely when we pass a function with one argument 【发布时间】:2021-12-30 12:15:00 【问题描述】:

javascript 菜鸟在这里。我不知道如何计算 map1,我一次更改了 array1 的每个元素,并且 map1 仍然打印为 -8。有没有人有任何关于 reduce() 方法的详细解释的链接?我一个都没找到!或者谁能​​解释一下发生了什么?

const array1 = [1, 4, 9, 16];
const map1 = array1.reduce(x => x - 2, 0);
console.log(map1); // shows -8

【问题讨论】:

结果完全独立于数组的值。你可以看看Array#reduce 的累加器。它的起始值为零,每次迭代都减 2。 这里没什么奇怪的,因为您只传递了累加器并减去 2 四次(数组的长度)。 【参考方案1】:

在 Javascript 中,reduce 接受

回调函数作为第一个参数。 累加器初始值作为第二个参数
array1.reduce(() => , initialValue);

这个回调主要有两个参数

第一个参数 = 累加器 第二个参数 = 当前值

累加器就像一个盒子,它可以获取上一次迭代返回的任何值。 我们可以使用它在每次迭代中添加内容。

让我们看一个基本的例子:

const initialValue = 0
const answer = [1,2,3,4].reduce((acc, curr) => 

, initialValue);
console.log('answer: ', answer);

这里我们有回调函数,它什么都不返回。

让我们看看这个例子的代码执行流程

对于第一次迭代,accumulator 设置为 0, 由于我们不返回任何内容,每次迭代都会返回 undefined,每次迭代都会设置 acc = undefined

当所有 4 次迭代都完成时,返回那个累加器。 (在这种情况下未定义)

示例 2:

const initialValue = 0
const answer = [1,2,3,4].reduce((acc, curr) => 
    return acc - 2; 
, initialValue);
console.log('answer: ', answer);

第一次迭代中,acc = 0 由于初始值但在本次迭代结束时,它返回一个值,即 0-2 = -2 . acc 设置为 -2。

第二次迭代acc-2 变为 -2-2 = -4。

第三次迭代acc-2 变为 -4-2 = -6。

第四次迭代acc-2 变为 -6-2 = -8。 (最后一次迭代,所以返回 `acc,我们得到 -8 作为最终结果)

由于我们使用箭头函数您可以删除括号''''和'return'关键字,将其写成单行

const initialValue = 0
const answer = [1,2,3,4].reduce((acc, curr) => acc - 2 , initialValue);
console.log('answer: ', answer);

最后两段代码完全相同,只是语法糖不同。

希望对你有帮助,有任何问题欢迎提问。

【讨论】:

因为更清楚地表明“initialValue”是reduce 函数参数而不是“reducingFunction”的参数而升级【参考方案2】:

简单地说,reduce 接受多个值。第一个是前一个值(在本例中为 0),第二个是可比较值(newValue),然后是索引和数组。

const map1 = array1.reduce((prevValue, newValue) => newValue - 2, 0);

在此处阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

【讨论】:

【参考方案3】:

这里没有什么奇怪的。看docs。

你在这里传递的是previousValue(或accumulator),初始值为0。每次迭代你只需忽略数组中的元素并返回previousValue - 2。这里有 4 次迭代,所以返回值为 -8。

【讨论】:

以上是关于当我们传递一个带有一个参数的函数时,JavaScript 的 reduce 方法表现得很奇怪的主要内容,如果未能解决你的问题,请参考以下文章

传递带有参数的函数以悬停在jQuery中

如何证明JavaScript中函数参数都是值传递

传递参数 Byreference 以提高速度和效率

参数传递

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

python 函数参数类型