2013-03-05 57 views
1

我通過ajax將JSON數據加載到對象中,將該對象複製到新對象(initData和newData)中。當我更改newData的屬性時,initData的屬性也會更改。這是爲什麼發生?爲什麼更新一個對象中的屬性會改變另一個對象?

var initData = {}; 
var newData = {};  

function load_data(NDB_No){ 
    $.getJSON(('scripts/jsonencode.php?q=' + NDB_No), function(data) { 

     for (prop in data){ 
      initData[prop] = data[prop]; 
      newData[prop] = data[prop]; 
     } 

    console.log('init data: ' + initData.properties.Protein); // "init data: 0.259" 
    console.log('new data: ' + newData.properties.Protein); // "new data: 0.259" 

    var n = parseFloat(newData.properties.Protein); 
    newData.properties.Protein = n+1; 

    console.log('init data: ' + initData.properties.Protein + 'new data: ' + newData.properties.Protein); 
    // "init data: 1.259 new data: 1.259" 
    // why are these the same when I only updated newData object? 


    }); 


} 
+0

要注意,「爲什麼這些在我只更新newData對象時是相同的?」......它們在更新newData對象之前是相同的。他們都指向內存中的相同位置。 Kolink在他的回答中對此進行了擴展。 – 2013-03-05 01:46:31

回答

4

它看起來像data[prop]是一個對象(因爲你在後面提到newData.properties.Protein)。對象總是通過引用傳遞,變量只是一個指向它的指針。

既然你在第一時間獲得JSON,你的對象是JSON-能,所以你可以用它來「克隆」的對象:

$.getJSON(...,function(data) { 
    initData = JSON.parse(JSON.stringify(data)); 
    newData = JSON.parse(JSON.stringify(data)); 
}); 

這將確保對象是分開的。還有其他的方法可以做到這一點,但通過使用內置方法(通常更快)這一個避免了手動遞歸

+0

感謝此工作,將會選擇此答案時有用。什麼是用於複製對象的正確詞彙?試圖閱讀它。 – chuckieDub 2013-03-05 01:57:25

+0

克隆物品。 – 2013-03-05 02:05:48

0

這同時設置引用相同的內存空間:

initData[prop] = data[prop]; 
newData[prop] = data[prop]; 

...等等當您更改newData時,也會更改initData。而不是通過引用進行分配,您需要創建副本。我必須跑步,所以我現在不能提供一個例子。

相關問題