我确定我读错了,但MDN说这个......
初值
用作第一次调用回调的第一个参数的值。如果未提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用reduce()是一个错误。
然后 说这个 ......这些不是说不同的东西吗?谢谢!
如果未提供initialValue,则reduce()将从索引1开始执行回调函数,跳过第一个索引。如果提供了initialValue,它将从索引0开始。
答案 0 :(得分:8)
措辞有点令人困惑,我同意。
将两个陈述放在一起:
如果没有提供初始值,则数组中的第一个元素将是
如果未提供initialValue,reduce()将执行回调 函数从索引1开始,跳过第一个索引
当没有提供初始值时,这两个语句实际上描述了reduce操作的两个不同特征:
这个措辞是否更有意义?:
如果未提供初始值,则第一个元素将用作初始值。在这种情况下,回调函数将从索引1开始,因为索引0已经通过使用它的值作为默认起始值来计算。
答案 1 :(得分:3)
不幸的是,我不能只是添加评论。请试试this。这是.reduce()函数的另一种解释,并举例说明它如何在http://javascript.info上运行。可能会帮助您更好地理解这一点。
此外,here是您在另一个StackOverflow讨论中没有初始值的空数组上的异常问题的答案。
如果没有提供initialValue,那么previousValue将等于 数组中的第一个值和currentValue将等于 第二。如果数组不包含任何元素,则为TypeError 未提供initialValue。
更新:可能, freeCodeCamp 上的这篇文章How JavaScript’s Reduce method works, when to use it, and some of the cool things it can do会很有用。
答案 2 :(得分:0)
简而言之:[a,b,c].reduce(...)
和 [b,c].reduce(..., a)
有时是一回事。更好的思考方式是,initialValue
实际上是计算的第一个中间结果。
为了更好地理解 reduce 的工作原理,请使用以下 sum(a,b)
函数,该函数为它执行的每个操作记录一个类似 a+b=c
的文本。
function sum(a,b) {
const c = a + b;
console.log(`${a} + ${b} => ${c}`)
return c;
}
const arr = [1,2,4,8];
const result = arr.reduce(sum);
console.log(`result=${result}`)
这将打印 1+2=3
、3+4=7
、7+8=15
和最后的 result=15
。
const arr = [1];
const result= arr.reduce(sum);
console.log(`result=${result}`)
如果数组中只有一个元素。然后它甚至根本不会调用提供的函数。 它只会返回单个元素。所以在这种情况下,它只会打印 result=1
。
const arr = [];
const result = arr.reduce(sum);
console.log(`result=${result}`)
如果没有元素也没有初始值,那么它只会抛出一个错误:Uncaught TypeError: Reduce of empty array with no initial value
当然,您可以在代码中添加检查以检查数组的 length
。
一个非常可靠的解决方法是在数组前添加一个初始值。
const arr = [];
const arr2 = [0, ...arr];
const result = arr2.reduce(sum)
initialValue
参数提供了更好的解决方案。很容易说 initialValue
实际上做了同样的事情。那是不正确的。
const result = arr.reduce(sum, 0);
然而,在此示例的上下文中,两者都导致相同的结果。但是,实际上initialValue
不是输入值,而是更像是初始总和。
有一个很小的区别,只有当您开始使用 reduce
进行更复杂的转换时才会变得明显。
const inputs = [{value: 1}, {value: 2}, {value:3}];
const total = inputs.reduce((sum, input) => sum + input.value, 0);
上面的示例再次创建了一个总数,但这次它从属性 value
中提取输入。我们有一个对象输入和一个数字结果。在这种示例中,initialValue
根本不是可选的。这是强制性的。
想想如果在这个例子中没有 initialValue
会发生什么。第一次迭代中 sum
的值是多少?
sum
实际上是 {value: 1}
,它甚至不是数字。
因此,在此示例中,很明显initialValue 实际上是计算的第一个中间结果。