我试图通过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
为什么前两个调用的结果不同,后两个调用相同?
答案 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。