实现reduce函数

93 阅读1分钟
Array.prototype.reduce = function(callback, initialValue) {
    if (this == undefined) {
      throw new TypeError('this is null or not defined');
    }
    if (typeof callback !== 'function') {
      throw new TypeError(callbackfn + ' is not a function');
    }
    const O = Object(this);
    const len = this.length >>> 0;
    let accumulator = initialValue;
    let k = 0;
    // 如果第二个参数为undefined的情况下
    // 则数组的第一个有效值作为累加器的初始值
    if (accumulator === undefined) {
      while (k < len && !(k in O)) {
        k++;
      }
      // 如果超出数组界限还没有找到累加器的初始值,则TypeError
      if (k >= len) {
        throw new TypeError('Reduce of empty array with no initial value');
      }
      accumulator = O[k++];
    }
    while (k < len) {
      if (k in O) {
        accumulator = callback.call(undefined, accumulator, O[k], k, O);
      }
      k++;
    }
    return accumulator;
}