一. JSON.parse(深拷贝)
JSON.parse(JSON.stringify(obj))是深拷贝,新对象和原对象彼此之间不会影响
let obj1 = {a:1,b:2,c:{name:'小明'},d:undefined,e:null,f:()=>{}}
let obj2 = JSON.parse(JSON.stringify(obj)) // 深拷贝对象: 不会互相影响
obj2.c.name = '小红'
console.log(obj1) // {a:1,b:2,c:{name:'小明'},d:undefined,e:null,f:()=>{}}
console.log(obj2) // {a:1,b:2,c:{name:'红'},e:null}
二.Object.assign(浅拷贝)
Object.assign()静态方法将一个或者多个源对象中所有可枚举和自有属性复制到目标对象,并返回修改后的目标对象
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 === target); // true
obj3 = Object.assign(obj1,obj2) 中 obj1和obj3 会指向同一个内存空间,会相互影响
let obj1 = {a:1,b:2}
let obj2 = {a:3}
let obj3 = Object.assign(obj1,obj2) // obj1和obj3指向同一个对象,同一个内存空间,会相互影响
console.log(obj1) // {a:3,b:2}
console.log(obj2) // {a:3}
console.log(obj3) // {a:3,b:2}
修改obj属性值是基本数据类型会相互独立, 修改obj属性值是引用数据类型会相互影响,是浅拷贝
const obj1 = { a: 0, b: { c: 0 } };
const obj2 = Object.assign({}, obj1);
console.log(obj2); // { a: 0, b: { c: 0 } }
// 1.修改obj属性值是基本数据类型会相互独立
obj1.a = 1;
console.log(obj1); // { a: 1, b: { c: 0 } }
console.log(obj2); // { a: 0, b: { c: 0 } }
// 2.修改obj属性值是引用数据类型会相互影响,因为Object.assign针对属性值是引用数据类型,拷贝的是地址
obj2.b.c = 3;
console.log(obj1); // { a: 1, b: { c: 3 } }
console.log(obj2); // { a: 2, b: { c: 3 } }