1. 程式人生 > 實用技巧 >Object.assign()拷貝是深拷貝還是淺拷貝問題

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

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

  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);