Функция сокращения работает как a для l oop, где переменная (a cc) устанавливается на каждой итерации:
Первые два примера, которые вы дали:
var a = [2,4,5,6,7]
a.reduce((acc,cur,i) => acc, [])
a.reduce((acc,cur,i) => acc, [0, 2])
Эквивалентно присвоению себе аккумулятора на каждой итерации:
var acc = []; // [0, 2] in the second one
for(var i=0; i < a.length; i++){
acc = acc;
}
В то время как ваш последний пример:
a.reduce((acc,cur,i) => acc[0], [0, 2])
Эквивалентно присвоению a cc его первое значение на каждой итерации:
var acc = [0, 2];
for(var i = 0; i < a.length; i++){
acc = acc[0];
}
Каждая итерация присваивает a cc его первое значение. Первая итерация будет выглядеть так:
acc = [0, 2];
i = 0
acc = acc[0] // 0;
Вторая итерация будет выглядеть следующим образом:
acc = 0;
i = 1
acc = acc[0] // undefined;
Теперь a cc назначено значение не определено , поскольку такого свойства нет 0 в значении a cc. Поэтому третья итерация будет выглядеть следующим образом:
acc = undefined;
i = 2;
acc = acc[0]; // Error, no property '0' of undefined.