什么是深拷貝,什么是淺拷貝?
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);