为什么直接在数组实例 o
上调用 Array.prototype.map
会导致“未修改”的数组?
var o = Array(3); // [ undefined, undefined, undefined ]
o.map((x,y) => y*2); // [ undefined, undefined, undefined ]
相反,我必须使用 apply(或 call):
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
,第二个还有属性 0
、1
和 2
.
Finally, an alternative to the above is: ...
扩展运算符将调用o[Symbol.iterator]
。数组的迭代器将遍历孔,就像使用普通的 for
循环时一样。
关于javascript - 为什么直接在 Array 实例上调用 Array.prototype.map 会产生 "unmodified"数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29660836/