Когда начальное значение не указано, первая итерация использует 0-й элемент как accumulator
, а 1-й элемент как currentValue
.Это будет работать для суммирования массива чисел и нескольких других полезных случаев.
var reducer = ( acc, val ) => {
console.log( acc, val );
return acc + val;
})
[ 1, 2, 3 ].reduce( reducer )
-> 1, 2
-> 3, 3
[ 1, 2, 3 ].reduce( reducer, 0 )
-> 0, 1
-> 1, 2
-> 3, 3
Другими словами, опускание начального значения в вашем случае похоже на выполнение:
[{x: 2}, {x: 3}].reduce( ( acc, val ) => acc + val.x, {x: 1} );
Поэтому первая итерация оценивается как {x: 1} + 2
.
reduce
с пустым массивом и без начального значения приведет к ошибке, поэтому рекомендуется всегда указывать его.