Array(len)初始值设定项中的未定义值

Eng*_*eer 25 javascript arrays undefined

考虑:

var a = Array(3);
var b = [undefined,undefined,undefined];
Run Code Online (Sandbox Code Playgroud)

是什么原因a.mapb.map产生不同的结果?

a.map(function(){  return 0;  });  //produces -> [undefined,undefined,undefined]
b.map(function(){  return 0;  });  //produces -> [0,0,0]
Run Code Online (Sandbox Code Playgroud)

Rob*_*b W 24

数组构造函数创建一个具有给定长度的数组.它并不会创建密钥.Array.prototype.map的回调函数仅对列表中的元素执行.
也就是说,这是与一个键(整数)相关联的所有值0≤ < 长度.

  • Array(3)没有键,所以.map回调永远不会被触发.
  • [void 0, void 0, void 0] 有三个键,为其执行回调函数.

    Array(3).hasOwnProperty(0);                 // false
    [void 0, void 0, void 0].hasOwnProperty(0); // true
    
    Run Code Online (Sandbox Code Playgroud)

MDN提到了规范及其填充物.在第47行,if (k in O) {显示回调函数不处理不存在的键.


jba*_*bey 6

来自MDN:

仅为已分配值的数组的索引调用回调; 对于已删除的索引或从未分配过值的索引,不会调用它.

对于数组a,您已实例化了一个长度为3但尚未分配任何值的数组.map函数找不到具有赋值的元素,因此它不会生成新数组.

对于数组b,您已实例化了一个包含3个元素的数组,每个元素都带有值undefined.map函数查找具有指定值的3个元素,并在新数组中返回"0"作为每个元素的新值.


Ori*_*iol 5

map 仅迭代现有属性,而不是空索引。

因此,如果您希望它起作用,则必须首先填充数组。

有多种方法可以做到这一点,例如: