Array(2)和[undefined, undefined]有什么区别?

14
[undefined, undefined, undefined].map(function(val, i) { return i });

返回 [0, 1, 2],而

Array(3).map(function(val, i) { return i });

返回值为[undefined, undefined, undefined]。

为什么?

5个回答

13
在第一种情况下,你已经用三个undefined定义初始化了一个新数组,而在第二种情况下,你仅仅定义了一个可能长度为3的数组。

new Array(3)与你如下操作相同:

var arr = [];
arr.length = 3;

因此,由于.length属性被隐式定义,.map()方法可以对分配在内存中的数组进行迭代,该数组基本上不包含任何定义的项(即纯粹为空)。


4
你正在声明指向未定义对象的指针,写入undefined。因此,[undefined]创建一个指向未定义的指针数组。new Array(3)创建了一个由未定义指针组成的数组,这些指针不会被数组原型方法(包括.map)循环遍历。

MDN参考文献。变量undefined实际上分配了一个值,即使它指向undefined


你的意思是 Array(1)[0] 和 [undefined][0] 在内部是不同的值? - Matt Zeunert
@Matt 不,我相信它们解除引用是相同的。 - Explosion Pills
1
它们不是不同的值。第二个有一个对值undefined的引用,因为全局对象的undefined属性最初设置为值undefined,因此引用到undefined,而Array(1)具有未定义的引用。这将评估为相同的值undefined,因此Array(1)[0] === [undefined][0] //true就像var undefined2;new Array(1)[0] === [undefined2][0],其中undefined2包含对值undefined的引用。 - Moritz Roessler

1

Array(3) 只是使用空数组手动指定长度:

> a = []
[]
> a.length = 3
3
> a
[ , ,  ]

这并不等同于手动构建一个包含未定义元素的数组:
> a = [undefined, undefined, undefined]
[ undefined, undefined, undefined ]


MDN文档中对于Array的解释详细说明了正在发生的事情:

如果只传递给Array构造函数一个介于0和232-1(含)之间的整数,将创建一个新的空JavaScript数组,并将其长度设置为该数字。如果参数是任何其他数字,则会抛出RangeError异常。

因此,数组被初始化为空数组[]。这就解释了为什么map不处理任何数组元素,因为没有元素。


一些例子可能会有所帮助。当使用Array(3)初始化数组时,它是空的,因此map没有要迭代的内容:
> Array(3)
    .map(function(val, i) { console.log(i); return i; });
[ , ,  ]

与下面的示例进行比较,您可以看到将每个中间数组值输出到控制台:
> [undefined, undefined, undefined]
    .map(function(val, i) { console.log(i); return i; });
0
1
2
[ 0, 1, 2 ]

1

正如@VisioN所提到的,Array(3)是已定义未初始化的。有趣的是,你可以通过Array.apply传递未初始化的数组,并对其进行初始化。我曾经使用这种方法来填充数组:

Array.apply(null, Array(3)).map(function(val,i) { return i; });
// [0, 1, 2]

0
<script type="text/javascript">
 test();
 test2();

function test() {
   [undefined, undefined, undefined].map(function(val, i) { console.log("un: " + val + "/" + i); return i; });
 }

 function test2() {
    Array(3).map(function(val, i) { console.log("no: " + val + "/" + i); return i; });
 }
</script>

test()函数返回:

un: undefined/0 un: undefined/1 un: undefined/2

test2()函数不返回任何值;

  • test()函数返回一个包含3个值(undefined)的对象
  • test2()函数返回一个长度为3的空数组

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接