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

时间:2013-10-28 22:38:48

标签: javascript

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

任何人都可以解释原因吗?

3 个答案:

答案 0 :(得分:7)

  

因此。我希望以下代码返回[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] == undefinedtrue

再次更正,因为(再次)new Array(10)没有在数组中放置任何元素,因此访问[0]会为您提供undefined

JavaScript的标准数组aren't really arrays at all,它们的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等形成鲜明对比,它们是传统意义上的真正数组。

答案 1 :(得分:3)

这将有效:

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

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

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

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

答案 2 :(得分:1)

以下是Mozilla开发者网络对Array.prototype.map所说的内容:

  

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

当您致电new Array(10)时,您创建的Array认为它长度为10个元素但未分配任何索引。以下是使用未为某些索引设置值的文字数组时会发生什么情况的示例:

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

你得到的价值是:

[ 'a', , 'a' ]

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