3 回答

TA貢獻1784條經驗 獲得超9個贊
不同之處在于,在第一個代碼段中,您修改了屬性中的嵌套對象info
,而在第二個代碼段中,您修改了包含對象。
當您進行淺拷貝時,girl
和newGirl
是不同的對象,但它們都包含對同一info
對象的引用。Sogirl.info
和newGirl.info
是同一個對象,修改其中一個的屬性會通過訪問另一個反映出來。
但是,如果您分配給girl.name
或newGirl.name
正在修改不同對象的屬性。您不會看到其他對象的變化。這就是您在第二個代碼段中通過分配給所做的事情output.age
。
深拷貝會復制遞歸引用的所有對象,而不僅僅是頂級對象。如果您進行深拷貝,則在訪問其他對象時不會看到任何級別的修改。

TA貢獻1798條經驗 獲得超3個贊
您在第二個示例中更改了兩件事:
將對象傳入和傳出函數
改變了對象的結構
您看到的差異與通過函數的額外間接無關,僅與對象的結構有關。
讓我們一次改變一件事,看看會發生什么:
const girl = { age: 20, number: 123 };
const newGirl = { ...girl };
newGirl.age = 30;
console.log(girl.age, newGirl.age);
輸出:20 30- 原始對象沒有被修改,因為我們直接復制了標量值age,所以這兩個屬性是完全分開的。
function test(obj) {
const output = { ...obj };
output.info.age = 30;
return output;
}
let person = { info: { age: 10 } }
let newPerson = test(person);
console.log(newPerson.info.age, person.info.age);
輸出是30 30- 原始對象已被修改,因為我們只復制了屬性的對象引用info,所以兩個屬性都持有指向同一個對象的引用。
添加回答
舉報