reduce方法接收两个参数,第一个参数是回调函数reducer,第二个参数是初始值。reducer函数接收四个参数:
- Accumulator:MDN上解释为累计器,但我觉得不恰当,按我的理解它应该是截至当前元 素,之前所有的数组元素被reducer函数处理累计的结果
- Current:当前被执行的数组元素
- CurrentIndex: 当前被执行的数组元素索引
- SourceArray:原数组,也就是调用reduce方法的数组
如果传入第二个参数,reduce方法会在这个参数的基础上开始累计执行。
概念讲了那么多,那reduce它的执行机制是怎样的呢?别着急,从用法入手一点一点分析。
来个最好理解的例子:数组求和
const arr = [1, 2, 3, 4]
const accumulator = (total, current, currentIndex, arr) => {
console.log(total, current, currentIndex, arr);
return total + current
}
console.log(arr.reduce(accumulator))
很明确,最终的结果就是把所有数组的元素都加起来。值得注意的是,它将数组的第一个元素作为累加的初始值,然后再依次对后边的元素执行reducer函数。
总共执行了三次,得出最终结果。那如果传入初始值,是怎样的执行顺序?
console.log(arr.reduce(accumulator, 3))
结果如下:
这次是以传入的初始值作为累加的起点,然后依次对数组的元素执行reducer。
假设对没有初始值的空数组调用reduce方法,则会报错:
Uncaught TypeError: Reduce of empty array with no initial value