js深拷贝和浅拷贝的总结

深拷贝

修改新变量的值不会影响原有变量的值
默认情况下基本数据类型都是深拷贝

浅拷贝

修改新变量的值会影响原有的变量的值
默认情况下引用类型都是浅拷贝

Object.assign()方法

	let obj1 = {
	   a: {
	     b: 1
	   },
	   c: 2
	}
	let obj2 = new Object();
	Object.assign(obj2 ,obj1)
	obj2.a.b = 3;
	obj2.c = 3
	console.log(obj1.a.b); // 3
	console.log(obj2.a.b); // 3
	console.log(obj1.c); // 2
	console.log(obj2.c); // 3

Object.assign(obj1, obj2)方法可以将第二个参数的对象的属性和方法拷贝到第一个参数的对象中
注意点: 只有被拷贝对象中所有属性都是基本数据类型, 才是深拷贝

JSON.parse和JSON.stringify方法

	let obj1 = {
        a : 1,
        b : {
            c : 2
        }
    };
    let obj2 = JSON.parse(JSON.stringify(obj1))
    obj2.b.c = 3;
    console.log(obj1.b.c); // 2
    console.log(obj2.b.c); // 3

注意点:这种方式会抛弃对象的constructor,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。这种方法适用于能转成JSON格式的对象,如对象、数组, 像Function没办法转成JSON就无法使用

递归实现深拷贝

    function deepCopy(target, source) {
            // 1.遍历获取source中的所有属性
            for (let key in source){
                // 2.取出当前遍历到的属性的取值
                let sourceValue = source[key];
                // 3.判断当前的取值是否为引用类型
                if(sourceValue instanceof Object){
                    // 通过constructor获取当前对象的构造函数,并new一个新对象
                    let subTarget = new sourceValue.constructor;
                    deepCopy(subTarget, sourceValue);
                    target[key] = subTarget;
                }else {
                    target[key] = sourceValue;
                }
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值