2017-06-14 81 views
2

new Array(3)返回包含3个undefined S的相当于[undefined, undefined, undefined]长度3的阵列;的Javascript映射()

然而,

[undefined, undefined, undefined].map((val, i) => i)产生的[0, 1, 2]预期的结果。但new Array(3).map((val, i) => i)产生[undefined, undefined, undefined],仿佛映射功能没有任何影响。

谁能解释一下为什么?

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

顺便说一句,如果你确实需要像[undefined, undefined, undefined]这样的数组迭代/映射,或者任何事情,那么[...new Array(m)]应该做的伎俩。

+3

*含有3个undefineds这相当于[未定义,未定义未定义]; *这是不对的。 – 2017-06-14 16:50:52

+0

Javascript中的数组是具有数值属性和'length'属性的奇特对象。 在'新阵列的情况下(3)',则产生具有其'length'设置为3,但没有任何数值属性的'Array'对象。你可以看到: > Object.keys(new Array(3)); Object.keys([undefined,undefined,undefined]); [“0”,“1”,“2”] 你可以用['Array.from']实现你想要的(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from?v = control): > Object.keys(Array.from({length:3})); [“0”,“1”,“2”] – error

+0

Doh。锁定之前,我可以发布我的答案。 – error

回答

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] 
3

新阵列(3)返回含有3个undefineds长度3的阵列,其等于[未定义,未定义未定义];

未按MDN

这意味着arrayLength空槽,以实际未定义的值不是槽阵列

3

当你新阵列(3)的Javascript保留记忆一个3个元素的数组,但没有定义它们中的任何一个。

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