JavaScript 手写 reduce()方法

reduce简介

reduce它有两种情况,一种是传了初始值,一种是没有传初始值。

如果没有传初始值的话,回调函数会执行 数组长度-1次,而传了初始值,回调函数则会执行 数组长度次。

let arr = [1,2,3,4];
arr.reduce((acc, cur, index) => {
  console.log(acc, cur, index);
  return acc+cur
},0) // 传了初始值
//回调函数执行了 4次 ,即数组长度次
//执行结果
// 0 1 0
// 1 2 1
// 3 3 2
// 6 4 3
let arr = [1,2,3,4];
arr.reduce((acc, cur, index) => {
  console.log(acc, cur, index);
  return acc+cur
}) // 没有传初始值
//回调函数执行了3次 ,即数组长度-1次
//执行结果
// 1 2 1
// 3 3 2
// 6 4 3

手写reduce

因此,这个continue 就太强了吧。因此如果没传初始值,第一次回调函数是不会进行执行的,但是下一次for循环会继续执行。

手写:

function reduce(arr, fn, initialValue) {
  let result = initialValue;
  for (let i = 0; i < arr.length; i++) {
    if (result === undefined && i === 0) {
      result = arr[i];
      continue; // 太妙了
      // 如果没传初始值,第一次将不会执行下面的回调函数
    }
    result = fn(result, arr[i], i, arr);
  }
  return result;
}

测试:

const arr = [1, 2, 3, 4];
const finalResult1 = reduce(arr, (acc, cur) => {
  return acc + cur
});
const finalResult2 = reduce(arr, (acc, cur) => {
  return acc + cur
},5);
console.log(finalResult1); //10
console.log(finalResult2); //15

你可能感兴趣的:(前端学习,javascript,开发语言,ecmascript)