JavaScript “new Array(n)” 和 “Array.prototype.map” 怪异

2022-08-30 00:13:56

我在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(function() { return 0; })
)
// [undefined, undefined, undefined]

console.log(
  y.map(function() { return 0; })
)
// [0, 0, 0]

这是怎么回事?这是一个错误,还是我误解了如何使用?new Array(3)


答案 1

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

let arr = new Array(10).map((val,idx) => idx);

要快速创建如下数组:

[0,1,2,3,4,5,6,7,8,9]

但它没有奏效,因为:(参见Jonathan Lonowski的答案下面的几个答案)

解决方案可能是使用Array.prototype.fill()用任何值填充数组项(即使使用未定义)

let arr = new Array(10).fill(undefined).map((val,idx) => idx);

console.log(new Array(10).fill(undefined).map((val, idx) => idx));

更新

另一种解决方案可能是:

let arr = Array.apply(null, Array(10)).map((val, idx) => idx);

console.log(Array.apply(null, Array(10)).map((val, idx) => idx));

答案 2

看来第一个例子

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 = [,,,];

由于映射在索引/属性列表中运行,而不是在设置的长度上运行,因此如果未创建索引/属性,则映射将不会运行。