javascript - 为什么直接在 Array 实例上调用 Array.prototype.map 会产生 "unmodified"数组?

标签 javascript arrays spread-syntax

为什么直接在数组实例 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,第二个还有属性 012 .

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

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

关于javascript - 为什么直接在 Array 实例上调用 Array.prototype.map 会产生 "unmodified"数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29660836/

相关文章:

javascript - ESRI javascript api中的点聚类

java - 构建一个仅打印基于文件的数组的特定部分的方法

c++ - 我的阵列没有容纳任何东西?

javascript - 使用映射和过滤器扩展语法

javascript - React - 使用相同的 props 传播 MapStateToProps

javascript - Backbone.js - 一个 View 应该如何更新多个 HTML 元素?

javascript - session 丢失时触发客户端事件

javascript - 如何从选择中获取两个不同的值?

Javascript/Node.js 数组内存管理

javascript - 在数组与对象中传播未定义