我希望以下代码返回 [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; })
也返回 [,,,,. ...]
。
谁能解释一下为什么?
So. I would expect the following code to return [1,1,1,1...].
(new Array(10)).map(function() { return 1;})
But it returns [, , , , , ...].
是的,因为 new Array(10)
创建了一个没有元素 的数组,length
为 10,map
只迭代实际存在的元素。 (是的,这令人惊讶。:-))
Moreover, (new Array(10)).length == 10
and (new Array(10))[0] == undefined
are true
.
再次正确,因为(再次)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
等,它们是传统意义上的真正数组。