我在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)?


当前回答

我认为最好的解释方式是看看Chrome处理它的方式。

>>> x = new Array(3)
[]
>>> x.length
3

因此,实际发生的情况是new Array()返回一个长度为3的空数组,但没有值。因此,当您在技术上为空的数组上运行x.map时,不需要设置任何内容。

Firefox只是用undefined“填充”这些空槽,即使它没有值。

我不认为这是一个明显的错误,只是一种表现正在发生的事情的糟糕方式。我想Chrome的是“更正确”,因为它显示数组中实际上没有任何东西。

其他回答

在ES6中,您可以执行[…Array(10)]。地图((a, b) => a),快捷方便!

由于在其他答案中详细解释的原因,数组(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)

我有一个任务,我只知道数组的长度,需要转换项目。 我想这样做:

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));

数组是不同的。不同之处在于,new Array(3)创建了一个长度为3但没有属性的数组,而[undefined, undefined, undefined]创建了一个长度为3的数组和三个名为“0”、“1”和“2”的属性,每个属性的值都为undefined。你可以用in操作符看出区别:

"0" in new Array(3); // false
"0" in [undefined, undefined, undefined]; // true

这源于一个有点令人困惑的事实,即如果您试图在JavaScript中获取任何原生对象的不存在属性的值,它将返回undefined(而不是抛出错误,当您试图引用不存在的变量时就会发生这种情况),这与之前显式地将属性设置为undefined时得到的结果相同。

既然问题是为什么,这与JS的设计方式有关。

我认为有两个主要原因可以解释这种行为:

性能:给定x = 10000和新Array(x),构造函数最好避免从0到10000循环填充未定义值的数组。 隐式"undefined":给定a = [undefined, undefined]和b = new Array(2), a[1]和b[1]都将返回undefined,但a[8]和b[8]即使超出范围也将返回undefined。

最终,符号empty x3是避免设置和显示一长串未定义值的快捷方式,因为它们没有显式声明。

注意:给定数组a =[0]和[9]= 9,console.log(a)将返回(10)[0,empty x 8,9],通过返回显式声明的两个值之间的差值自动填充空白。