算法
    截屏2022-06-13 23.03.01.png截屏2022-06-13 23.03.16.png截屏2022-06-13 23.03.26.png截屏2022-06-13 23.03.39.png

    myReduce

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