我在Firefox-3.5.7/Firebug-1.5.3和Firefox-3.6.16/Firebug-1.6.2中观察到这一点
当我启动Firebug时:
var x = new Array(3)
console.log (x)
// [undefined, undefined, undefined]
Var y = [undefined, undefined, undefined]
console.log (y)
// [undefined, undefined, undefined]
Console.log (x.constructor == y.constructor) // true
console.log (
X.map(函数(){返回0;})
)
// [undefined, undefined, undefined]
console.log (
Y.map(函数(){返回0;})
)
// [0,0,0]
这是怎么回事?这是一个错误,还是我误解了如何使用新数组(3)?
我有一个任务,我只知道数组的长度,需要转换项目。
我想这样做:
let arr = new Array(10).map((val,idx) => idx);
快速创建一个这样的数组:
[0,1,2,3,4,5,6,7,8,9]
但这并不奏效,因为:
(参见乔纳森·洛诺夫斯基的回答)
解决方案是使用array .prototype.fill()将数组项填充为任何值(甚至是undefined)
let arr = new Array(10).fill(undefined).map((val,idx) => idx);
console.log(新数组(10).fill(定义)。Map ((val, idx) => idx));
更新
另一个解决方案是:
let arr = Array.apply(null, Array(10)).map((val, idx) => idx);
console.log(数组。应用(null,数组(10))。Map ((val, idx) => idx));
我认为最好的解释方式是看看Chrome处理它的方式。
>>> x = new Array(3)
[]
>>> x.length
3
因此,实际发生的情况是new Array()返回一个长度为3的空数组,但没有值。因此,当您在技术上为空的数组上运行x.map时,不需要设置任何内容。
Firefox只是用undefined“填充”这些空槽,即使它没有值。
我不认为这是一个明显的错误,只是一种表现正在发生的事情的糟糕方式。我想Chrome的是“更正确”,因为它显示数组中实际上没有任何东西。
看来第一个例子
x = new Array(3);
创建一个长度为3但没有任何元素的数组,因此不会创建索引[0]、[1]和[2]。
第二个创建了一个包含3个未定义对象的数组,在这种情况下,它们自己的索引/属性被创建,但它们引用的对象是未定义的。
y = [undefined, undefined, undefined]
// The following is not equivalent to the above, it's the same as new Array(3)
y = [,,,];
因为map在索引/属性列表上运行,而不是在设置的长度上运行,所以如果没有创建索引/属性,它将不会运行。
由于在其他答案中详细解释的原因,数组(n)。地图不能用。然而,在ES2015中Array.from接受一个map函数:
let array1 = Array.from(Array(5), (_, i) => i + 1)
console.log('array1', JSON.stringify(array1)) // 1,2,3,4,5 .log('array1', JSON.stringify(array1)
让array2 = Array.from({长度:5},(_,我)= > (i + 1) * 2)
console.log('array2', JSON.stringify(array2)) // 2,4,6,8,10 .log('array2', JSON.stringify(array2)