2014-09-27 62 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