新Array()的Javascript映射

时间:2017-06-14 16:47:48

标签: javascript arrays undefined

new Array(3)返回一个长度为3的数组,其中包含3 undefined s,相当于[undefined, undefined, undefined];

然而,

[undefined, undefined, undefined].map((val, i) => i)生成[0, 1, 2]的预期结果。但new Array(3).map((val, i) => i)会产生[undefined, undefined, undefined],就像地图功能无效一样。

有人可以解释原因吗?

EDIT 看起来我对new Array()的理解存在缺陷。它不会创建新数组。它创建一个对象length等于传入的参数。感谢您的回答和评论。

顺便说一句,如果你确实需要一个像[undefined, undefined, undefined]这样的数组来迭代/映射,或者对于任何事情,那么[...new Array(m)]就可以做到这一点。

3 个答案:

答案 0 :(得分:3)

  

new Array(3)返回一个长度为3的数组,其中包含3个未定义的数,相当于[undefined,undefined,undefined];

不符合MDN

  

这意味着arrayLength空插槽的数组,而不是具有实际未定义值的插槽

答案 1 :(得分:3)

当你做新的数组(3)Javascript为3个元素的数组保留内存,但没有定义任何数组。

当你通过[undefined,undefined undefined]创建一个数组时,它实际上创建了3个元素,每个元素的值都是未定义的(因此,它是一个长度为3的数组)。

答案 2 :(得分:3)

要理解javascript中没有数组类型是一件重要的事情。内置Array只是标准Object的便利。唯一的区别是数组具有length属性,以特殊方式计算。

new Array(3)返回一个包含length字段的对象。它不包含任何其他键。

{
   length: 3
}

[undefined, undefined, undefined]创建一个包含3个数字槽的对象:

{
   length: 3
   0: undefined,
   1: undefined,
   2: undefined,
}

这有所不同,因为map和其他迭代器会查找实际存在于对象中的数字键。 mapforEach和朋友背后的逻辑是这样的:

  for (var i = 0; i < A.length; i++)
      if (A.hasOwnProperty(i))
          do something with A[i]