什么是深拷贝,什么是浅拷贝?
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也被修改
实现深拷贝的几种方法:
let _ = require(‘lodash‘); let obj1 = { a: 1, b: { f: { g: 1 } }, c: [1, 2, 3] }; let obj2 = _.cloneDeep(obj1);
原文:https://www.cnblogs.com/huxiuxiu/p/13658071.html