Object.assign()拷貝是深拷貝還是淺拷貝問題
阿新 • • 發佈:2020-09-12
什麼是深拷貝,什麼是淺拷貝?
B複製A--A變B變,淺拷貝; A變B不變,深拷貝。
Object.assign() 方法:用於將所有可列舉屬性的值從一個或多個源物件複製到目標物件。它將返回目標物件。 並且源物件也會被修改。
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); // expected output: Object { a: 1, b: 4, c: 5 } console.log(returnedTarget); // expected output: Object { 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);