2013-07-13 27 views
2
var array = []; 
var arr = []; 
var i; 
for (i = 0; i < 2; i++) { 
    var temp = [];// using array[i] = new Array() works fine 
    array.push(temp); 
    arr.push(temp); 
} 
array[0].push(1); 
arr[0].push(2); 
alert(array[0]); 

上面的javascript代碼給出了[1,2]。 使用'新陣列()'而不是'push([])'給出[1]。 我能找到問題,但我不明白爲什麼。可有一個人解釋這JavaScript中的2D數組的初始化和賦值

+0

首先你必須解釋你想要執行什麼。 – MaxArt

+0

你寫下你得到的結果,但是你能告訴我們你期望得到的結果是什麼嗎? – Sumurai8

+1

'array [0]'和'arr [0]'指的是同一個數組。 –

回答

1

此代碼將創建一個數組,並把參考這裏面既arrray和常用3

var temp = [];// using array[i] = new Array() works fine 
array.push(temp); 
arr.push(temp); 

所以,當你運行:

array[0].push(1); 
arr[0].push(2); 
alert(array[0]); 

然後,你先推1到原始tmp,它在數組[0]中有引用,然後再次將2 push到tmp,這在arr [0]中也是如此,因此您將得到[1,2]。

我沒看到完整的替代代碼,但我認爲,如果你有這樣的在你的for循環:

array[i] = new Array(); 
arr[i] = new Array(); 

然後,你就必須在陣列中的兩個獨立的陣列和改編,所以當你運行再次:

array[0].push(1); 
arr[0].push(2); 
alert(array[0]); 
alert(arr[0]); 

你會在數組[1]中得到1和在數組[1]中得到2。

+0

thanx。我不知道它會將參考引用到數組中。 – Naruto

2

陣列工作像指針在存儲器中的某個位置,以便所述ARR變量dosent商店u的推 實際值實際上它指向其中的值被存儲 並且在這種情況下,它指向的存儲器位置「TEMP」 所以,當你寫

for (i = 0; i < 2; i++) { 
    var temp = [];// using array[i] = new Array() works fine 
    array.push(temp); 
    arr.push(temp); 
} 

正在發生的事情是,在每個循環它創建一個新的臨時但兩者「陣列的ARR」 都指向同一個位置,在內存中,所以當一個他們正在模擬這個位置的內容,改變另一個指向的數據。

同時,如果使用下面的代碼

var array = []; 
var arr = []; 
var i; 
for (i = 0; i < 2; i++) { 
    array[i] = new Array(); 
    arr[i] = new Array(); 

} 
array[0].push(1); 
arr[0].push(2); 
alert(array[0]) 

究竟會hapen這裏是每一個「新的Array()」被調用的時候它會在內存中分配一個新的變量和回傳的位置到你創建的數組指針「array & arr」 所以現在每個previos指針都指向內存中的不同位置