Поведение, которое вы видите, связано с шагом 9.2: обратный вызов вызывается только тогда, когда свойство присутствует в объекте.Он выполняет итерацию 5 раз, но после удаления 3 элементов в четвертой и пятой итерации a.hasOwnProperty(3)
и a.hasOwnProperty(4)
имеют значение false.
Мы можем лучше всего продемонстрировать это с помощью прокси:
const a = [0,1,2,3,4];
new Proxy(a, {
has(target, p) { const v = Reflect.has(target, p); console.log("has", p, v); return v },
get(target, p) { const v = Reflect.get(target, p); console.log("get", p, v); return v }
}).reduce((p, e) => {
a.length--;
console.log("at " + e, a);
return p;
}, null);
Или, альтернативно, путем вызова reduce
для объекта, чьи .length
изменения не влияют на свойства:
const a ={0:0,1:1,2:2,3:3,4:4,length:5,reduce:Array.prototype.reduce};
a.reduce((p, e) => {
a.length--;
console.log("at " + e, a);
return p;
}, null);