为什么直接在 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
,第二个还有属性0
、1
和2
.
Finally, an alternative to the above is: ...
传播操作员将调用o[Symbol.iterator]
。数组的迭代器将遍历空洞,就像使用普通 for
循环时一样。
为什么直接在数组实例 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
,第二个还有属性0
、1
和2
.
Finally, an alternative to the above is: ...
传播操作员将调用o[Symbol.iterator]
。数组的迭代器将遍历空洞,就像使用普通 for
循环时一样。