JS深拷贝和浅拷贝

谈到深拷贝和浅拷贝,首先要知道javascript的数据类型和存储方式。
JS数据类型:可分为简单数据类型(基本数据类型)和复杂数据类型(引用数据类型):
简单数据类型:String、Number、Boolean、undefined和null
复杂数据类型:通过new创建的对象、系统对象、自定义对象。如:Object、Array、Date等
简单数据类型和复杂数据类型的存储方式也是不一样的,这时就要引入的概念。堆和栈不做深入讲解。总之,
简单数据类型存储在栈中;
复杂数据类型则存储在堆里,在栈中会存储一个十六进制的地址指向堆中的数据。

    /*堆和栈*/
    // 简单数据类型
    var a = 1;
    var b = a;
    a = 3;
    console.log(b)// b=1
    // 复杂数据类型
    var obj1 = {
        b: 1,
        c: {
            c1: 123
        },
        d: 3
    }
    var obj2 = obj1;
    console.log(obj2.b)//1
    obj1.b = 2;
    console.log(obj2.b)// 2

如上所示,简单数据类型就不说了。复杂数据类型在把obj1赋值给obj2的时候obj2的b的值是1,然后再修改obj1的b的值后,发现obj2的b的值也随之修改了。
因为obj2和obj1存储的是指向堆中的一个十六进制地址,obj1和obj2指向堆中的数据是同一个。所以通过obj1修改了堆中的值,响应的obj2取到堆中的值也随之变化了。这个就是一个浅拷贝的过程,浅拷贝只拷贝了复杂数据的地址。
反之,深拷贝则拷贝整个复杂数据的值。那如何实现深拷贝?对象可以使用for…in进行遍历,我们可以遍历对象,一级一级地进行拷贝。
总体思路就是,使用for…in进行对象的遍历,当碰到复杂数据类型时,再进行一次for…in遍历,一级一级地拷贝。这是就会使用到递归的方式。

    var obj = { //被拷贝的对象
        name: 'xm',
        age: '22',
        sex: '男',
        home: {
            city: '浙江',
        },
        hobby: {
            hobby1: ['chi', 'he', 'play'],
            hobby2: {
                ceshi: [123, 456, 789],
                xm: 'nb'
            }
        }
    }
    var obj1={};//想要拷贝到这个对象
    function shenkaobei(obj, obj1) {
        for (var k in obj) {	//for...in遍历对象
            if (obj[k] === 'object') {//一级一级进去,如果是复杂数据类型,调用shenkaobei这个函数
                shenkaobei(obj[k], obj1[k]);
            } else {
                obj1[k] = obj[k];
            }
        }
        return obj1;
    }
    obj1 = shenkaobei(obj, obj1);
    obj.hobby = {
        ceshi: 6666
    }
    console.log(obj)
    console.log(obj1)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈梵阿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值