Javascript 为什么这个reduce函数只在指定最后一个参数时才起作用?

Javascript 为什么这个reduce函数只在指定最后一个参数时才起作用?,javascript,Javascript,reduce方法仍然让我感到困惑。 为什么 const sumOfCubes = nums => nums.reduce((a,b) => a + Math.pow(b, 3)) 不工作,但是 const sumOfCubes = nums => nums.reduce((a,b) => a + Math.pow(b, 3), 0) 是吗?因为使用reduce时,您应该声明累加器的起始值/默认值。在第二个示例中,您使用传递0作为参数来执行此操作 您可以在此处阅读更多信

reduce方法仍然让我感到困惑。 为什么

const sumOfCubes = nums => nums.reduce((a,b) => a + Math.pow(b, 3))
不工作,但是

const sumOfCubes = nums => nums.reduce((a,b) => a + Math.pow(b, 3), 0)

是吗?

因为使用
reduce
时,您应该声明累加器的起始值/默认值。在第二个示例中,您使用传递
0
作为参数来执行此操作

您可以在此处阅读更多信息:

正如@VLAZ所建议的,如果您不声明,它将使用数组的第一个元素并跳过它:

初始值可选 用作回调的第一个调用的第一个参数的值。如果未提供initialValue,则将使用并跳过数组中的第一个元素。在没有initialValue的空数组上调用reduce()将引发TypeError


只有一个参数,
array.reduce(fn)

for (let i = 1, a = array[0]; i < array.length; ++i)
  a = fn(a, array[i]);
for(设i=1,a=array[0];i
因此,在你的例子中,第一个值2永远不会是三次方,所以你得到了错误的和

对于第二个参数,它就像:

for (let i = 0, a = secondParameter; i < array.length; ++i)
  a = fn(a, array[i]);
for(设i=0,a=secondParameter;i

因此,在第一次迭代中,当您将其作为第二个参数传递时,要添加的值正确地为0,并且数组中的每个值都将被立方化。

如果您不提供初始参数,那么
a
将是数组中的第一个元素。这意味着使用
[2,3,4]
时,第一个操作将是
2+Math.pow(3,3)
“您需要声明累加器的起始值/默认值是什么”,您不需要这样做。如果不这样做,则将获取数组的第一个元素作为初始值。这可以奏效,但并不总是如此。