2011-09-06 65 views
2

好的,當寫象下面這樣:Javascript數組怪異的行爲

var element = { "name": "" }; 

var array = []; 

for (var i = 0; i < 2; ++i) { 
    var newelement = element; 
    newelement.name = i.toString(); 
    array[i] = newelement; 
}  

導致:數組[0]。名稱==陣列[1]。名稱== 「1」。 但寫以另一種方式:

var element = { "name": "" }; 

var array = []; 

for (var i = 0; i < 2; ++i) { 
    var newelement = { "name": i.toString() }; 
    array[i] = newelement; 
} 

導致:數組[0]。名稱== 「0」 和陣列[1]。名稱== 「1」。

告訴我爲什麼。

回答

6

因爲在第二個示例中,您將在每次迭代中創建一個新對象,但在第一個示例中,您始終引用相同的元素。

+0

Ehhhhhh我是多麼愚蠢......既然閱讀了一篇關於「不要在javascript中使用新的」的文章,那麼每個「=」都被翻譯成「= new」。無論如何謝謝你的回答〜 – rhapsodyn

+0

而json是一種呈現OBJECT的方式 – rhapsodyn

2

這是一個很好的Javascript問題,讓人們遇到和理解。

在第一個代碼塊中,您將指定newelementelement的引用。每次通過循環時,newelement獲得分配給它的相同參考。您不會創建任何新對象,只需重複指定相同的對象。

在第二個代碼塊中,您正在循環內創建一個新對象,以便每個賦值都轉到另一個對象。

您需要記住,在JavaScript中,將對象分配給變量只會分配對該對象的引用。

var newelement = element; // just assigns a reference to an existing object 

然而,這樣的分配是創建一個新的對象:

var newelement = { "name": i.toString() }; // creates a new object 

所以,第一個代碼示例中,你有array[0]array[1]每到同一對象的引用。修改該對象時,它將同時影響array[0]array[1],因爲它們都指向該對象。

在第二個代碼示例中,array[0]array[1]都指向不同的對象,因此當您修改一個對象時,它不會影響其他對象。

這是javascript中一個棘手的部分,它經常會讓C/C++程序員(當我第一次學習JS的時候就會得到我)用於類似於第一個作業的結構副本。除非您使用專門創建新對象的語法,否則JavaScript默認只分配一個引用。