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)]
就可以做到这一点。
答案 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
和其他迭代器会查找实际存在于对象中的数字键。 map
,forEach
和朋友背后的逻辑是这样的:
for (var i = 0; i < A.length; i++)
if (A.hasOwnProperty(i))
do something with A[i]