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

(new Array(10)).map(function() { return 1;}) returns [, , , , , ...] ... Why?

本文关键字:返回 Array new map function return      更新时间:2023-09-26

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

(new Array(10)).map(function() { return 1;})

但它返回[, , , , , ...].

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

对于z = function(){return 0;};来说,表达z(undefined) === 0也是正确的。

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

谁能解释为什么?

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

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

是的,因为new Array(10)创建一个没有length为 10 的元素的数组,并且map只迭代实际存在的元素。(是的,这令人惊讶。

而且,(new Array(10)).length == 10(new Array(10))[0] == undefined true.

再次

正确,因为(再次)new Array(10)不会在数组中放置任何元素,因此访问[0]会让您undefined.

JavaScript 的标准数组根本不是真正的数组,它们可以有一个正数length,而其中没有任何条目。它们是"稀疏"数组的一种形式。

让我们举一个更简单的例子:

var a = new Array(10);
a[2] = 1;

该数组包含一个元素,即索引 2 处的元素。索引 0 处没有元素,索引 1 处没有元素,索引 3 及以上索引处没有元素。它只是那里有差距。你可以通过问它来判断:

console.log(0 in a); // "false"
console.log(1 in a); // "false"
console.log(2 in a); // "true"

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

这与较新的"类型化"数组(Int32Array等)形成鲜明对比,这些数组是传统意义上的真正数组。

这将起作用:

Array.apply(null, Array(10)).map(…

现场演示:http://jsfiddle.net/xXG5p/

您必须先使数组密集。 new Array(n)创建一个稀疏数组。稀疏数组确实有length但它们没有元素。因此,.map()调用根本不会迭代。

使用我上面的代码,您将创建一个包含元素的密集数组(其值最初设置为 null )。

以下是Mozilla开发者网络对Array.prototype.map的评价:

仅对已分配值的数组索引调用回调;不会对已删除或从未赋值的索引调用回调。

当你调用 new Array(10) 时,你创建的Array认为它是 10 个元素的长,但它的索引都没有被分配给。下面是一个示例,说明如果使用尚未为某些索引设置值的文本数组,则会发生什么情况:

[1, , 3].map(function () {return "a"})

您获得的值为:

[ 'a', , 'a' ]

因为在索引 1 处,没有分配任何值。