我需要不在数组的成员上执行reduce函数,而只在索引上执行。我尝试了以下方法。
const len = 4;
const arr = new Array(len);
const total = arr.reduce((accum, dummy, index) => calculate(accum, index), 0);
这行不通 我试着添加了一些打印输出,似乎reduce语句中的函数永远不会被调用。
然而,如果我将arr替换为:
const arr = [0,1,2,3];
那么它就能正常工作。我缺少了什么?我使用的数组的长度确实被验证为4,那么为什么它没有像应该的那样执行函数4次?
new Array(len)
创建一个带有 length
的财产 len
但 橆 任何数组的索引 own-properties。
const arr = new Array(3);
console.log(arr.hasOwnProperty(1));
这就是所谓的 稀疏数组,几乎总是应该避免,因为创建它们会产生像你正在经历的奇怪的结果。你可以 .fill
数组,使每个数组的索引值从0至 length - 1
的值。
const arr = new Array(3).fill(0);
console.log(arr.hasOwnProperty(1));
那么 reduce
将能够对数组进行迭代。
由于 规格 说。
9. Repeat, while k < len,
a. Let Pk be ! ToString(k).
b. Let kPresent be ? HasProperty(O, Pk).
c. ****If kPresent is true, then*****
i. Let kValue be ? Get(O, Pk).
ii. Set accumulator to ? `Call(callbackfn, undefined, « accumulator, d. kValue, k, O »)`.
由于一个备用数组 不 有任何数组索引的自身属性,则在 .reduce
回调 calllbackfn
在规范中)从未被调用。