算法



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开始,因为累加器会默认为initvalinitIndex = 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// 传入undefinedlet res2 = arr.reduce((pre, cur) => {return cur + pre}, undefined);console.log(res2); // NaNlet arr1 = [];let res3 = arr1.reduce((pre, cur) => {return pre + cur}); // TypeError: Reduce of empty array with no initial valuelet res4 = arr1.myReduce((pre, cur) => {return pre + cur}); // TypeError: Reduce of empty array with no initial value
