2013-05-13 37 views
1

我有以下JavaScript的2維數組

var arrayT = new Array(); 
    arrayT['one'] = arrayT['two'] = new Array(); 
    arrayT['one']['a'] = arrayT['one']['b'] = ''; 
    arrayT['two'] = arrayT['one']; 
    arrayT['two']['a'] = 'test'; 
    console.log(arrayT); 

在控制檯我

[one][a]='test' 
    [one][b]='' 
    [two][a]='test' 
    [two][b]='' 

爲什麼?

jsFiddle

回答

3

arrayT['one'] = arrayT['two'] = new Array(); 

創建單個共享陣列對象。你的二維數組中的每個「內部」陣列實際上只是對同一個對象的引用,所以改變一個「內部」陣列必然會影響其他在完全相同的方式。

相反,創建兩個單獨的數組:

arrayT['one'] = new Array(); 
arrayT['two'] = new Array(); 

Futhermore,即使你實現這種變化,該行:

arrayT['two'] = arrayT['one']; 

將產生同樣的問題 - arrayT['two']arrayT['one']將指向同一個對象,有可能導致今後性質類似的問題(例如,在NEX改變arrayT['two']['a'] t行將改變arrayT['one']['a'],因爲它們指向相同的對象)。

3

arrayT['one']arrayT['two']是相同的陣列,你讓一個會影響到其他的任何變化。

爲了解決這個問題,創建單獨的數組:當您使用arrayT['one'] = arrayT['two'] = new Array()

arrayT['one'] = new Array(); 
arrayT['two'] = new Array(); 

到同一陣列中的多個引用此問題的發生,但arrayT['two'] = arrayT['one']將產生同樣的問題。爲了使arrayT['two']arrayT['one']副本,你應該使用下列內容:

arrayT['two'] = arrayT['one'].slice(); 
0

雖然apsillers是正確的,他的答案,更準確的更換是簡單地寫arrayT['two'] = arrayT['one'].slice(0) 離開了分配給arrayT['two']在第2行 請注意,這只是一個淺拷貝。根據您的需要,如果您稍後決定使用可變對象,則可能需要進行深層複製。