0

为什么Array.prototype.map直接在 Array 实例上调用会o导致“未修改”数组?

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]

我想是因为这可以纠正我原始实现中缺少的任何内容。

4

1 回答 1

4

为什么直接在 Array 实例上调用 Array.prototype.map 会导致“未修改”数组?

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

相反,我必须使用 apply (或调用):...我错过了什么?

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

如果你比较,差异会变得更加明显

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

第一个只有属性length,第二个也有属性012

最后,上述方法的替代方案是:...

价差运算符将调用o[Symbol.iterator]. 数组的迭代器将遍历孔,就像使用普通for循环一样。

于 2015-04-15T21:07:08.660 回答