3

我希望以下代码返回[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; })也返回[,,,,....]

谁能解释为什么?

4

3 回答 3

7

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

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

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

此外,(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;

该数组包含一个元素,即 index 处的元素2。index0没有元素, index1没有元素, index 及以上没有元素3。它只是有差距。你可以通过询问来判断:

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

JavaScript 中的标准数组只是具有特殊行为的对象,分配lengthArray.prototype.

这与较新的“类型化”数组形成鲜明对比Int32Array,它们是传统意义上的真正数组。

于 2013-10-28T22:44:30.410 回答
4

这将起作用:

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

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

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

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

于 2013-10-28T22:43:17.273 回答
1

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

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

当您调用new Array(10)时,Array您创建的对象认为它有 10 个元素长,但它的任何索引都没有被分配过。下面是一个例子,如果你使用一个没有为某些索引设置值的文字数组会发生什么:

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

你得到的价值是:

[ 'a', , 'a' ]

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

于 2013-10-28T22:46:28.863 回答