簡體   English   中英

為什么一個對象中的更新屬性會更改另一個對象?

[英]Why does updating properties in one object change another object?

我正在通過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?


    });


}

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

由於您首先獲得了JSON,因此您的對象具有JSON功能,因此您可以使用它來“克隆”該對象:

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

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

這將兩者都設置為引用相同的內存空間:

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

...所以當你改變newData ,你也改變了initData 您需要創建副本,而不是通過引用分配。 我必須跑,所以我現在不能提供一個例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM