重新创建 JavaScript Reduce 函数第 2 部分

Recreating JavaScript Reduce function part 2

这与我在此处重新创建的 reduce 函数有关,但问题不同:Recreating JavaScript's reduce function

我正在阅读 Eloquent JavaScript 并注意到他们用更少的代码以稍微不同的方式重新创建了 reduce 函数:

function reduce(array, combine, start) {
  var current = start;
  for (var i = 0; i < array.length; i++)
    current = combine(current, array[i]);
  return current;
}

console.log(reduce([1, 2, 3, 4], function(a, b) {
  return a + b;
}, 0)); // → 10

我注意到这只有在开始时才有效。例如,如果我拿走 start(0) 并且它只是:

console.log(reduce([1, 2, 3, 4], function(a, b) {
  return a + b;
})); // NaN

它会 return NaN。这对我来说没有意义,因为书上说: "If your array contains at least one element, you are allowed to leave off the start argument. The method will take the first element of the array as its start value and start reducing at the second element."

只有当我用 if 语句调整它时,它才会产生带或不带 start(0) 的“10”。

function reduce(array, combine, start) {
  var current = start;

  for (var i = 0; i < array.length; i++)
    if(current !==undefined){
      current = combine(current, array[i]);
    }else{
      current=array[i]; 
    }

 return current;
}

我错过了什么?

根据 MDN(这里是简化版),它应该是这样的:

function reduce(array, combine, start) {
  var current = start;
  var i = 0;
  if (arguments.length < 2) {
    while (array[i] === undefined) {
      i ++;
      if (array.length >= i) {
        throw new Error('Empty array with no initial value');
      }
    }
    current = array[i];
  }

  for (; i < array.length; ++ i) {
    if (array[i] === undefined) continue;
    if (current !== undefined) {
      current = combine(current, array[i]);
    } else {
      current=array[i]; 
    }
  }

  return current;
}