JavaScript:手撕reduce()方法

Array.prototype.reduce = function (callback, initValue) {
  // 检查数组是否为null或undefined
  if (this == undefined) throw new TypeError("this is null or undefined");
  // 检查callback是否是函数
  if (typeof callback !== "function")
    throw new TypeError(`${callback} is not a function`);

  const arr = Object(this); // 确保arr为对象
  const arrLength = arr.length >>> 0; // 确保length为正数

  let index = 0; // 第一个有效值索引
  if (initValue === undefined) {
    // 寻找第一个有效值
    while (index < arrLength && !(index in arr)) index++;
    // index超出数组范围,证明是空数组
    if (index >= arrLength) {
      throw new TypeError("empty array");
    }
    // 设置初始值
    initValue = initValue ? initValue : arr[index++];
  }
  let res = initValue; // 初始化结果
  // 计算结果
  for (let i = index; i < arrLength; i++) {
    if (i in arr) res = callback(res, this[i], i, this);
  }
  return res;
};

参考:

in 运算符
Object() 构造函数

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