我正在尝试通过 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
为什么前两次调用的结果不同而后两次调用的结果相同?
最佳答案
如果您不向 .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。
关于JavaScript 减少有/没有初始值的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50826718/