Object.assign()拷貝是深拷貝還是淺拷貝問題


什么是深拷貝,什么是淺拷貝?

  B復制A--A變B變,淺拷貝; B變A不變,深拷貝。

Object.assign(target, source) 方法:用於將所有可枚舉屬性的值從一個或多個源對象復制到目標對象。

它將返回目標對象。 並且目標對象也會被修改,如果不想修改目標對象,可以將目標對象改成空 {}

let user = {name:'無敵人',age:19};
let page = {pageSize:10,currentPage:1};
let newObj = {};
Object.assign(newObj,user,page);
// newObj={name:'無敵人',age:19,pageSize:10,currentPage:1}
Object.assign(obj1,obj2)
obj1為主對象,obj2為被合並對象
合並完成之后重復的鍵值對將被刪除
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target); // { a: 1, b: 4, c: 5 }
console.log(returnedTarget); // Object { a: 1, b: 4, c: 5 }
console.log(target) // {a: 1, b: 4, c: 5}
如果目標對象中的屬性具有相同的鍵,則屬性將被源對象中的屬性覆蓋。后面的源對象的屬性將類似地覆蓋前面的源對象的屬性。
支持多個對象合並,如果不想修改目標對象,可以將目標對象改成空 {}, 例如:const returnedTarget
= Object.assign( {} , source,source);

Object.assign()拷貝:當對象中只有一級屬性,沒有二級屬性的時候,此方法為深拷貝,但是對象中有對象的時候,此方法,在二級屬性以后就是淺拷貝。

第一級是深拷貝:
let a = {James: {age: 18}}
let b = Object.assign({}, a)
b.James = 20
console.log(b) // { James: 20 }
console.log(a) // { James: { age: 18 } }
以后各級是淺拷貝:
let a = {James: {age: 18}
let b = Object.assign({}, a)
b.James.age = 20
console.log(b) // { James: { age: 20 } }
console.log(a) // { James: { age: 20 } } //源對象a也被修改

實現深拷貝的幾種方法:

1.JSON.stringify 和 JSON.parse

2.Object.assign()拷貝第一級是深拷貝,以后各級是淺拷貝
3.通過jQuery的extend方法實現深拷貝
4.lodash.cloneDeep()實現深拷貝
let _ = require('lodash'); 
let obj1 = { a: 1, b: { f: { g: 1 } }, c: [1, 2, 3] };
let obj2 = _.cloneDeep(obj1);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM