嵌套对象中的更新,奇怪的行为

Updates in nested objects, odd behavior

本文关键字:更新 对象 嵌套      更新时间:2023-09-26

我有两个对象。在我的代码中的某一点,我希望将第一个对象的副本存储在第二个对象中。

只要一切正常。对奇怪的部分说不。如果我对第一个对象进行任何更改,则相同的更改将应用于第二个对象(这不是意图)。我想这是因为两者之间的某种参照是保留的。

Exampel 说明了这个问题:

//First object
var person = {
    value: 1,
    item: 2
}
//Second object
var objSum = {
    contain: person,
    info: "other stuff"
}
//Apply change to first object
person.value = 55;
//Echoing second object
console.log(objSum);
    alert("done");

日志输出:包含 => 项:2,值:55。信息:"其他东西"

我希望它是:包含 => 项:2,值:1。信息:"其他东西"

这可能很简单,但我无法理解它。为什么会发生这种情况,我该如何防止它

在将person-object分配给objSum.contain时,您需要克隆它,否则您将分配对原始对象的引用。最简单的方法是使用 jquery:

var objSum = {
    contain: jQuery.extend({}, person);
};

var objSum = {
    contain: jQuery.extend(true, {}, person);
};

如果人本身也包含对象

您需要克隆对象"person",而不是引用它。

几种方法可以克隆对象,并且已经有著名的问题和答案......

在 JavaScript 中深度克隆对象的最有效方法是什么?

对于您的情况,使用 JSON 方法就可以了。

//First object
var person = {
    value: 1,
    item: 2
}
//Second object
var objSum = {
    contain: JSON.parse(JSON.stringify(person)), //clone object
    info: "other stuff"
}
//Apply change to first object
person.value = 55;
//Echoing second object
console.log(objSum);
alert("done");