JavaScript浅拷贝和深拷贝

浅拷贝:

浅拷贝就是复制,就相当于把一个对象中的所有的内容,复制一份给另一个对象,直接复制,或者说,就是把一个对象的地址给了另一个对象,他们指向相同,两个对象之间有共同的属性或方法,都可以使用。

浅拷贝:仅仅复制对象的引用,而不是对象本身。 

    var obj1={
        name: "Tom",
        age: 25,
        sex: "男",
        car:["奔驰","宝马","奥迪"]
    }
    var obj2={};

    //函数:浅拷贝,把一个对象中的所有属性复制到另一个对象中
    //把a对象中的所有属性复制到b对象中
    function shallowCopy(a,b){
        for(var key in a){
            b[key] = a[key];
        }
    }

    shallowCopy(obj1,obj2);
    obj2.name = "Jack";
    obj2.car[0] = "北京现代";
    console.dir(obj1);
    console.dir(obj2);

输出结果:


上面可以看出,浅拷贝,改变obj2对象中单层属性name的值,obj1对象中单层属性name的值不会被改变,但是改变obj2对象中car的值,obj1对象中car的值也相应的被改变了。

深拷贝:

深拷贝也是复制,但是,深:就是把一个对象中所有的属性或方法,一个一个的找到,并且在另一个对象中开辟相应的空间,一个一个的存储到另一个对象中。

深拷贝:复制对象所引用的全部对象。

    var obj1={
        name: "Tom",
        age: 25,
        sex: "男",
        car:["奔驰","宝马","奥迪"],
        dog:{
            name: "大黄",
            age: 5,
            color: "黄色"
        }
    }
    var obj2={};

    //函数:深拷贝,把一个对象中的所有属性深拷贝到另一个对象中
    //把a对象中的所有属性深拷贝到b对象中
    function deepCopy(a,b){
        for(var key in a){
            //先获取a对象中每个属性的值
            var item = a[key];
            //分情况拷贝
            if(item instanceof Array){
                //判断这个属性的值是不是数组
                //如果是数组,那么在b对象中添加一个新的属性,是一个空数组
                b[key] = [];
                //再调用这个方法,把a对象这个数组属性的值,一个个复制到b对象的这个数值属性中去
                deepCopy(item,b[key]);
            }else if(item instanceof Object){
                //判断这个属性的值是不是对象
                //如果是对象,那么在b对象中添加一个新的属性,是一个空对象
                b[key] = {};
                //再调用这个方法,把a对象中的这个对象属性的值,一个个复制到b对象中的这个对象属性中去
                deepCopy(item,b[key]);
            }else{
                //如果值是普通数据,直接复制到b对象的这个属性中
                b[key] = item;
            }
        }
    }

    deepCopy(obj1,obj2);
    obj2.name = "Jack";
    obj2.car[0] = "北京现代";
    obj2.dog.name = "豆豆";
    console.dir(obj1);
    console.dir(obj2);

输出结果:


从上面可以看到,深拷贝可以解决浅拷贝中的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值