JavaScript使用/不使用初始值来减少行为

时间:2018-06-12 22:31:27

标签: javascript

我试图通过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 个答案:

答案 0 :(得分:8)

如果你没有向.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。