[英]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.