JS对象的拷贝详解

一、直接赋值

 特点:会将对象的地址赋给复制的对象,改变复制对象会将原数据改变

 不推荐适用

二、Object.assign(target, sources)

 特点:修改赋值后的对象B的非对象属性,不会影响原对象A的非对象属性;修改赋值后的对象B的对象属性,却会影响原对象A的对象属性

 适用:提高性能减少内存,有数组、函数等

var person = {name:"张三",sex:'男',address:{province:"北京市",city:"海淀区"},age:(function(){return '原数据'})(),status:['程序员','打工仔']};
    var copy = {};
    Object.assign(copy,person)
    //修改赋值对象的非对象  不会导致原数据的变化
    copy.name = '李四';
    copy.age = (function(){return '改变的数据'})();
    copy.status = ['科学家','老板']
    //修改赋值对象的对象  会导致原数据的变化
    copy.address.province = "天津"
    console.log('copy',copy);
    console.log('person',person);
    console.log('dizhi',copy === person);

三、JSON.parse(JSON.stringify(sources));

 特点:从堆内存中开辟一个新的区域存放新对象

 缺点:SON.stringify()会导致一系列的问题,因为要严格遵守JSON序列化规则:原对象中如果含有Date对象,JSON.stringify()会将其变为字符串,之后并不会将其还原为日期对象。或是含有RegExp对象,JSON.stringify()会将其变为空对象,属性中含有NaN、Infinity和-Infinity, 则序列化的结果会变成null,如果属性中有函数,undefined,symbol则经过JSON.stringify()序列化后的JSON字符串中这个键值对会消失,因为不支持。

适用:对象中没有函数等属性

var person2 = {name:"王二",sex:'女',address:{province:"浙江省",city:"杭州"},age:function(){let a = 'change'},status:['程序员','打工仔']};
    let copy3 = JSON.parse(JSON.stringify(person2));
    console.log('copy3',copy3);
    console.log('person2',person2);
    console.log('dizhi',copy3 === person2);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值