亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

javascript對象中的淺拷貝問題

javascript對象中的淺拷貝問題

慕尼黑8549860 2023-05-11 15:54:03
const girl = {  name: 'Anna',  info: { age: 20, number: 123 }};const newGirl = { ...girl };newGirl.info.age = 30;console.log(girl.info.age, newGirl.info.age);輸出為 30 30,我們使用展開運算符將 girl 對象的屬性復制到 newGirl 對象中。此運算符創建對象的淺表副本。淺拷貝不能避免突變。讓我們看另一個例子function test(obj) {  const output = { ...obj };  output.age = 30;  return output;}let person = { age: 10 }let newPerson = test(person);console.log(newPerson.age, person.age); // output is 30 10如您所見,第二個示例也使用展開運算符來創建對象的副本。為什么它的行為與第一個示例不同?為什么它不影響原始對象字段數據?
查看完整描述

3 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

不同之處在于,在第一個代碼段中,您修改了屬性中的嵌套對象info,而在第二個代碼段中,您修改了包含對象。

當您進行淺拷貝時,girlnewGirl是不同的對象,但它們都包含對同一info對象的引用。Sogirl.infonewGirl.info是同一個對象,修改其中一個的屬性會通過訪問另一個反映出來。

但是,如果您分配給girl.namenewGirl.name正在修改不同對象的屬性。您不會看到其他對象的變化。這就是您在第二個代碼段中通過分配給所做的事情output.age。

深拷貝會復制遞歸引用的所有對象,而不僅僅是頂級對象。如果您進行深拷貝,則在訪問其他對象時不會看到任何級別的修改。


查看完整回答
反對 回復 2023-05-11
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

中唯一的值person是不可變的原語 ( 10)。沒有可以通過引用復制的對象(與對象girlwhere不同)。info



查看完整回答
反對 回復 2023-05-11
?
呼如林

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,所以兩個屬性都持有指向同一個對象的引用。


查看完整回答
反對 回復 2023-05-11
  • 3 回答
  • 0 關注
  • 238 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號