Piszemy polyfille dla funkcji reduce oraz reduceRight. Do dzieła.

Reduce:

Array.prototype.myReduce= function(callbackFn, initialValue) {
    var accumulator = initialValue;
  for (var i = 0; i < this.length; i++) {
      if (accumulator !== undefined) {
        accumulator = callbackFn.call(undefined, accumulator, this[i],   i, this);
      } else {
        accumulator = this[i];
      }
    }
    return accumulator;
  }

Użycie:

 let sum = [1,2,3].myReduce(function(acc, curr){
        return acc + curr;
  },0);

 console.log(sum);
 //6

reduceRight:

  Array.prototype.myReduceRight= function(callbackFn, initialValue) {
    var accumulator = initialValue;
  for (var i = this.length - 1; i >= 0; i--) {
      if (accumulator !== undefined) {
        accumulator = callbackFn.call(undefined, accumulator, this[i],   i, this);
      } else {
        accumulator = this[i];
      }
    }
    return accumulator;
  }

Użycie:

  let right = [1,2,3].myReduceRight((acc, val) => acc - val, 10);
  console.log(right);
  //4

Jedyne, co tu mamy podchwytliwego, to jak podejść do sytuacji, w których initialValue nie zostało przekazane. Inne polyfille nie będą takie proste!