js高级之浅拷贝和深拷贝的理解

js高级之浅拷贝和深拷贝的理解


对象的拷贝分为浅拷贝和深拷贝

1、浅拷贝

案例:var obj1 = {
                    name: "zs",
                    age: 20,
                    sex: "男",
                    dog: {
                            name: "金毛",
                            age: 2,
                            yanse: "yellow",
                    },
            }
           var obj2 = {};  //注意:此时obj2的地址和obj1的地址不一样。
            copy(obj1, obj2);
            //console.dir(obj2);//此时也将dog属性及所有的成员也复制过来了,
            //那此时修改一下obj1的成员,是否会影响obj2呢?
    obj1.name="xxx";
    obj1.dog.name="大黄";
    console.dir(obj1);
            console.dir(obj2); //此时obj2的成员受影响,但obj2的dog的成员受影响了,为什么?
    //因为obj1下的成员是简单(基本)数据类,存储在栈上,但dog成员是一个对象,
    //在内存空间中会开辟一个空间,此时obj1和obj2的dog的地址都对应一个空间地址,
    //所以当obj1中的dog的成员被修改了之后,obj2中的dog也被修改了


    ★上面的拷贝就是浅拷贝,浅拷贝就是当一个对象拷贝给另一个对象时,
    只把第一层数据拷贝过去了,复杂类型的成员知识把地址拷贝了过去★

2、深拷贝

案例:var obj1 = {
        name : "zs",
        age : 18,
        sex : "男",
        dog : {
            name : "金毛",
            age : 2,
        },
        friends: [ "ls","ww" ]
    }
    //深拷贝,把o1的成员拷贝给o2
    function deepCopy(o1,o2){
        for(var  key in  o1){
            //获取key属性对应的值
            var item = o1[key];
            //如果item是对象?进行判断
            if(item  instanceof  Object){
                //如果是对象,
                //则o2对象中创建一个对象来接收这个对象的成员
                o2[key] = { };//新创对象来接收
                deepCopy(item, o2[key]);   
//利用递归
            //如果item是数组?进行判断
            }else if (item  instanceof  Array){
                //如果是数组,
                //则o2对象中创建一个数组来接收这个数组的成员
                o2[key] = [ ]; //新创数组来接收,否则接收的是undefined的数组
                deepCopy(item, o2[key]); 
//利用递归
            //如果成员是简单类型,就直接浅拷贝
            }else {        
                o2[key] = o1[key];
            }    
        }
    }    
    var  obj2 = { };  //注意:此时obj2的地址和obj1的地址不一样。
    deepCopy(obj1,obj2);  //把obj1的成拷贝给obj2
    //修改obj1中的成员,是否会影响obj2?
    obj1.dog .name = "xxx";
    obj1.friends[0]="007";
    console.dir(obj1);//输出修改后的obj1的成员
            console.dir(obj2);//输出obj1拷贝的原成员

    答案是没有改变值,因为对象间进行了深拷贝,深拷贝拷贝的是多层,故在堆里互不影响

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值