JavaScript の Array#reduce のイテレータは最初の要素を適用しない

Array.prototype.reduce() - JavaScript | MDN

関数が呼び出される初回は、 previousValue と currentValue は 2 つの値のうちの 1 つを取り得ます。reduce 呼び出し時に、initialValue が与えられた場合、previousValue は initialValue と等しくなり、currentValue は、配列の最初の値と等しくなります。 initialValue が与えられなかった場合、previousValue は配列の最初の値と等しくなり、currentValue は、2 番目の値と等しくなります。

知らなかったのではまった。 reduce の第二引数に初期値を渡さないとイテレータは配列の要素の2番目から実行される。

// alert は上がらない
[1].reduce((p, c)=> {
  alert(c);
  return p + c;
});

// alert が一回上がる
[1, 2].reduce((p, c)=> {
  alert(c);
  return p + c;
});