2014-09-27 64 views
2

我一直在一些奇怪的事情迷迷糊糊.... 也许有人可以尝试解释这两者之间的区别:JavaScript的数组怪异动初始化

var a1=Array(2); 
var a2=Array.apply(null,a1); 
console.log(a1); 
console.log(a2); 
console.log(a1[0]===a2[0]); 

注意的事项是相等的,但看起来阵列的控制台日志不同(在Chrome和NodeJS上)。

也是其中的其他方面似乎不同的工作:

a1.map(function(i){console.log("!");}) 
a2.map(function(i){console.log("!");}) 

通知映射itereares只为A2不是为A1。

这发生在NodeJS,Chrome和FF上。

任何想法?

+0

而不检查文档,我会说,'A1 =阵列(2)''套a1'与长度为2的数组,但不显式地分配任何元素。而'a2 = Array.apply(null,a1)'就像说'a2 = Array(undefined,undefined)',即它将两个元素的值明确地设置为'undefined'。 '.map()'只迭代已经明确设置的元素。 – nnnnnn 2014-09-27 06:23:48

+0

换句话说,(我猜在这种情况下)关键是'someArray [someIndex]'将返回'undefined'出于两个可能的原因:1.因为'someIndex'处的元素从未被赋值,或者2.因为'someIndex'处的元素被显式赋值为'undefined'。而你的'a1 [0] === a2 [0]'测试是比较原因1'未定义'与原因2'未定义'。 – nnnnnn 2014-09-27 06:26:39

回答

4

在JavaScript中,这将创建一个稀疏数组:

var a = new Array(3) // a = [ , , ,] 

如果您尝试遍历一个使用mapforEach,JavaScript的跳过孔。调用

var b = Array.apply(null, Array(3)) // b = [undefined, undefined, undefined] 

(这等价于用Array(undefined, undefined, undefined)调用数组构造)

创建一个密集阵列bba几乎相同,但现在您可以迭代元素,换句话说,因为数组现在密集,map和foreach不会跳过元素。

+1

指针的10倍....进一步查看它,发现你实际上可以用两个例子来区分:console.log(a1,0中的a0); – srfrnk 2014-09-28 08:00:24