JavaScript使用reduce方法时,有无初始值的行为差异

9
我正在尝试使用JavaScript的reduce函数对数组中的数字平方求和。但是,当有或没有给出初始值时,reduce方法的结果不同。
var x = [75, 70, 73, 78, 80, 69, 71, 72, 74, 77];
console.log(x.slice().reduce((ac,n) => ac+(n*n))); // 49179
console.log(x.slice().reduce((ac,n) => ac+(n*n),0)); // 54729

这应该与上面的调用等价:
console.log(x.slice().map(val => val*val).reduce((ac,n) => ac+n)); // 54729

然而,在这种情况下,两种方法返回相同的值。

console.log([1,2,3].slice().reduce((ac,z) => ac+(z*z))); // 14
console.log([1,2,3].slice().reduce((ac,z) => ac+(z*z), 0)); // 14

为什么前两次调用的结果不同,后两次的结果相同?
1个回答

28
如果您未向 .reduce() 提供第二个参数,则它会使用数组的第一个元素作为累加器,并从第二个元素开始。
在第一个例子中,.reduce() 迭代的第一个结果是:
75 + 70 * 70

在第二个版本中,当显式传递一个0时,它是

0 + 75 * 75

这导致的计算级联会得出不同的结果。

在第二个例子中,你最终会计算

1 + 2 * 2

然后

5 + 3 * 3

在第一行中,给出了14。在第二个版本中,当你以 0 开头时,你将计算

0 + 1 * 1
1 + 2 * 2
5 + 3 * 3

这也是14。


我明白了。所以它会跳过对(n*n)的调用。这很有道理。 - VinArrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接