js对象深拷贝(深克隆)

18 篇文章 0 订阅

我们首先看下面的例子:

		var userInfo = {username:"zhangsan",age:20}
		var copyUserInfo = userInfo;
		userInfo.username='lisi';
		console.log(userInfo);
		console.log(copyUserInfo);

结果:
在这里插入图片描述
上面对象中的字段类型都是基本类型,所以上面拷贝的都是浅拷贝。

那么怎么实现深度拷贝的,也就说拷贝的对象再次修改互不影响呢?

1.通过JSON序列化

通过JSON.stringify() 和 JSON.parse() 将对象转为字符串之后在转为对象。

	var userInfo = {username:"zhangsan",age:20}
	var copyUserInfo = JSON.stringify(userInfo);
	userInfo.username='lisi';
	console.log(userInfo);
	console.log(copyUserInfo);

结果:
在这里插入图片描述

2.使用对象的合并,即通过Object.assign()方法

注意:该方法的第一个参数必须是空对象
如果已知克隆的对象的属性都是基本类型,如{name: ‘jack’, age: ‘18’},可以利用ES6的Object.assign()实现克隆。

var userInfo = {username:"zhangsan",age:20}
   		var copyUserInfo = Object.assign({}, userInfo);
   		userInfo.username='lisi';
   		console.log(userInfo);
   		console.log(copyUserInfo);    
     ![在这里插入图片描述](https://img-blog.csdnimg.cn/1a67d51161b6402c987c22102458d760.png)

不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。

function clone(origin) {
  var originProto = Object.getPrototypeOf(origin);
  return Object.assign(Object.create(originProto), origin);
}
var obj = {name: 'jack', age: '18'};
var newObj = clone(obj);     

3.使用拓展运算符+解构赋值

该方法的局限性在于,当值为undefined、function、symbol会在转换过程中被忽略。

			var userInfo = {username:"zhangsan",age:20}
  		var copyUserInfo = {...userInfo};
  		userInfo.username='lisi';
  		console.log(userInfo);
  		console.log(copyUserInfo);

4.利用循环递归

    以上四种方法只能进行一层拷贝,即当对象的属性值也是对象时,就无法实现该属性的深拷贝,在这里提供一种利用循环递归进行深拷贝的方法。
    var obj = {
        name: "123",
        sex: { age: "小花" }
    };
    var newObj = {};
    function deepClone(obj, newObj) {
        var newObj = newObj || {};
        for (let key in obj) {
            if (typeof obj[key] == 'object') {
                newObj[key] = (obj[key].constructor === Array) ? [] : {}
                deepClone(obj[key], newObj[key]);
            } else {
                newObj[key] = obj[key]
            }
        }
        return newObj;
    }
    console.log(deepClone(obj, newObj));//{name: "123",sex: {age: '小花'}}
                
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半夏_2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值