reduce方法是Array.prototype上的一个方法,是在es6中添加的数组方法。
语法:
arr.reduce(callback[, initialValue])
callback: 是一个function参数,该function接收四个参数
accumulator
:累加器
currentValue
:数组中正在处理的元素
currentIndex
:正在处理的元素的索引
array
:原数组
initialValue: 可选,用于充当callback的第一个参数的初始值,如果不传该值,则callback的第一个参数是数组的第一个值。
该方法执行后返回累计处理的结果。
如果传了initialValue,callback第一次执行的时候accumulator为initialValue,currentValue为数组中的第一个值;如果没有传initialValue,callback第一次执行的时候,accumulator为数组的第一个值,currentValue为数组中的第二个值。
值得注意的是:
1、如果数组为空,且initialValue为空,会抛出TypeError。
2、如果数组仅有一个元素,且没有提供initialValue,那么此唯一值将被返回并且callback不会被执行。
3、如果数组为空,且提供了initialValue,那么此唯一值将被返回并且callback不会被执行。
1、如果数组为空,且initialValue为空,会抛出TypeError。
2、如果数组仅有一个元素,且没有提供initialValue,那么此唯一值将被返回并且callback不会被执行。
3、如果数组为空,且提供了initialValue,那么此唯一值将被返回并且callback不会被执行。
接下来我们来看下这三种情况:
1、数组为空且initialValue为空
[].reduce((pre, cur) => {
console.log(pre, cur);
return pre + cur;
});
// 将会抛出异常 Uncaught TypeError: Reduce of empty array with no initial value
// 但是这段代码将不会报错,因为初始值不为空
[].reduce((pre, cur) => {
console.log(pre, cur);
return pre + cur;
}, 1);
2、数组仅有一个元素且initialValue为空
[1].reduce((pre, cur) => {
console.log(pre, cur);
return pre + cur;
});
[,1,,,].reduce((pre, cur) => {
console.log(pre, cur);
return pre + cur;
});
// 以上两种情况都将输出1,且console.log不会输出。
[null,1,null].reduce((pre, cur) => {
console.log(pre, cur);
return pre + cur;
});
// 这种方式也将输出1,但是callback是执行的
// 请注意[1],[,1,,]和[null,1,null]的区别
3、数组为空,且initialValue不为空
[].reduce((pre, cur) => {
console.log(pre, cur);
return pre + cur;
}, 1);
// 结果将输出1,且callback不执行