算法
myReduce
Array.prototype.myReduce = function(fn, initVal){
// 参数校验
if(Object.prototype.toString.call(fn) !== '[object Function]'){
throw new Error('Not a function');
}
// 是否传入初始值
let arr = this;
if(arr.length === 0 && arguments.length === 1){
throw new Error('TypeError: Reduce of empty array with no initial value')
}
let initIndex;
// 累加器
let accumulator;
// 是否传入initVal
// 就算是传入undefined也会作为初始值,因此不能判断initVal是否等于undefined来判断
// 通过参数的长度来判断是否传入
// 如果没有传入了第二个参数,那么初始索引我们在第二项开始执行,因为累加器会默认为数组的第一项
// 如果传入了第二个参数,那么初始索引从0开始,因为累加器会默认为initval
initIndex = arguments.length === 1 ? 1 : 0;
// 设置累加器初始值
accumulator = arguments.length === 1 ? arr[0] : initVal;
for(let i = initIndex; i < arr.length; i++){
// 调用回调函数并赋值给累加器
// 回调函数中传入四个参数,分别为当前累加器的值,当前要进行累加的值,当前索引,原数组
accumulator = fn(accumulator, arr[i], i, arr);
}
return accumulator;
}
// 测试
arr = [1, 2, 3, 4, 5, 6, 7];
// 不传入初始值
let res = arr.myReduce((pre, cur) => {return cur + pre});
console.log(res); // 28
// 传入初始值
let res1 = arr.reduce((pre, cur) => {return cur + pre}, 10);
console.log(res1); // 38
// 传入undefined
let res2 = arr.reduce((pre, cur) => {return cur + pre}, undefined);
console.log(res2); // NaN
let arr1 = [];
let res3 = arr1.reduce((pre, cur) => {return pre + cur}); // TypeError: Reduce of empty array with no initial value
let res4 = arr1.myReduce((pre, cur) => {return pre + cur}); // TypeError: Reduce of empty array with no initial value