为什么直接在 Array 实例上调用 Array.prototype.map 会导致 "unmodified" 数组?

Why does invoking Array.prototype.map directly on Array instance result in an "unmodified" array?

为什么直接在数组实例 o 上调用 Array.prototype.map 会导致 "unmodified" 数组?

var o = Array(3); // [ undefined, undefined, undefined ]
o.map((x,y) => y*2); //  [ undefined, undefined, undefined ]

相反,我必须使用应用(或调用):

Array.apply(0, o).map((x, y) => y*2)); // [ 0, 2, 4 ]

我错过了什么?

最后,上面的替代方法是:

[...o].map((x, y) => y*2); // [ 0, 2, 4]

我想是因为这纠正了我最初实施中遗漏的任何内容。

Why does invoking Array.prototype.map directly on Array instance o result in an "unmodified" array?

因为.map只对实际存在的元素起作用。 Array(3) 创建一个 长度为 3 的数组。换句话说:.map 省略孔。

Instead, I have to use apply (or call): ... What am I missing?

Array.apply(0, o) 在您的情况下等同于 Array(undefined, undefined, undefined),即您正在创建一个包含三个元素的数组。

比较一下差异就更明显了

console.dir(Array(3));
// vs
console.dir(Array.apply(null, Array(3)));

第一个只有属性length,第二个还有属性012.

Finally, an alternative to the above is: ...

传播操作员将调用o[Symbol.iterator]。数组的迭代器将遍历空洞,就像使用普通 for 循环时一样。