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

IT技术 javascript
2021-03-01 09:42:25

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

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

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

而且, (new Array(10)).length == 10而且(new Array(10))[0] == undefined都是真的。

而forz = function(){return 0;};表达式z(undefined) === 0也是如此。

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

谁能解释为什么?

3个回答

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

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

是的,因为new Array(10)创建了一个没有元素alength为 10的数组,并且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;

该数组包含一个元素,即 index 处的元素2在 index 处0没有元素,在 index没有元素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)创建一个稀疏数组。稀疏数组确实有 alength但它们没有元素因此,.map()调用根本不会迭代。

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

其他人都在谈论为什么它不能工作。您提供了一个解决方案。谢谢!
2021-04-23 09:42:25

以下是 Mozilla 开发者网络关于Array.prototype.map 的说明

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

当您调用 时new Array(10)Array您创建的对象认为它的长度为 10 个元素,但从未分配过任何索引。下面是一个示例,说明如果您使用尚未为某些索引设置值的文字数组,会发生什么情况:

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

你得到的value是:

[ 'a', , 'a' ]

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