JSON.parse(JSON.stringify(obj)) 和Object.assign()的区别

一. 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 } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值