(new Array(10)).map(function(){return 1;})返回[,,,,, ...]为什么?

mas*_*rre 3 javascript

我希望以下代码返回 [1,1,1,1...]

(new Array(10)).map(function() { return 1;})
Run Code Online (Sandbox Code Playgroud)

但它回来了[, , , , , ...].

此外, (new Array(10)).length == 10(new Array(10))[0] == undefined是真实的.

而且z = function(){return 0;};表达z(undefined) === 0也是如此.

然而,我注意到它[,,,,,,,,,,].map(function() { return 1; })也会回归[,,,,....].

有谁能解释为什么?

T.J*_*der 7

所以.我希望以下代码返回[1,1,1,1 ...].

(new Array(10)).map(function() { return 1;}) 但它返回[,,,,, ...].

正确的,因为new Array(10)创建以与阵列没有元素length10,和map仅遍历实际存在的元素.(是的,这令人惊讶.:-))

此外,(new Array(10)).length == 10(new Array(10))[0] == undefinedtrue.

再次正确,因为(再次)new Array(10)没有在数组中放置任何元素,因此访问[0]给你undefined.

JavaScript的标准数组根本不是真正的数组,并且它们可以具有length正数而不包含任何条目.它们是"稀疏"阵列的一种形式.

我们来看一个更简单的例子:

var a = new Array(10);
a[2] = 1;
Run Code Online (Sandbox Code Playgroud)

该数组包含一个元素,即索引处的元素2.索引处0没有元素,索引处1没有元素,索引3及其上没有元素.它只是有差距.你可以问它:

console.log(0 in a); // "false"
console.log(1 in a); // "false"
console.log(2 in a); // "true"
Run Code Online (Sandbox Code Playgroud)

JavaScript中的标准数组只是具有特殊行为的对象,length分配给一类属性名称(松散地,数字名称)的特殊行为,以及由它们支持的特殊行为Array.prototype.

这与新的"类型"阵列形成鲜明对比Int32Array,这些阵列是传统意义上的真正阵列.