JavaScript 减少有/没有初始值的行为

标签 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

为什么前两次调用的结果不同而后两次调用的结果相同?

最佳答案

如果您不向 .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/

相关文章:

javascript - 如何找到两个 JavaScript 对象数组之间的差异?

javascript - 我如何将项目添加到选定的追加列表 jquery

javascript - 如何让基本的 jQuery 选项卡在 .Net 模式弹出窗口中工作?

javascript - 如何取消文档方法的关闭事件- addEventListener ('close' )

javascript - 如何查找从星期一开始的日历中的星期几?

Javascript/jQuery 获取我正在输入的文本区域的 id

在 Internet Explorer 10+ 中将 Javascript/Jquery 导出到 Excel

javascript - slim 长按

javascript - 为什么在 Chrome 选项卡中更改 url 在输入指定 url 时不会更新选项卡 Url?

javascript - javascript 中的 jQuery .each()