深拷贝和浅拷贝

深拷贝和浅拷贝

  • 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用。
  • 深拷贝拷贝多层,每一级数据都会拷贝。

浅拷贝:

在这里插入图片描述

造成的问题

  • 把深层次的地址拷贝给了赋值对象。赋值对象更改深层次属性时,原对象也会发生改变。
  • 原理:俩个对象指向同一块区域,共享属性
     <script>
         var obj={
             id:1,
             name:'andy',
             msg:{
                 age:18
             }
         };
         var o={};
         for(var k in obj){
             //k是属性名 obj[k]属性值
             o[k]=obj[k];
         }
         o.msg.age=20;
         console.log(o.msg.age);//20
         console.log(obj.msg.age);//20
     </script>

浅拷贝方式。把obj浅拷贝给o

 Object.assign(o,obj);

深拷贝

在这里插入图片描述

  • 把深层次的地址拷贝给了赋值对象。赋值对象更改深层次属性时,原对象不会发生改变。
  • 原理:赋值对象开辟了一个新的空间,指向了新的空间。
<body>
     <script>
         var obj={
             id:1,
             name:'andy',
             msg:{
                 age:18
             },
             color:['pink','red']
         };
         var o={};
         function deepCopy(newobj,oldobj){
             for(var k in oldobj){
                //判断属性属于简单还是复杂数据类型
               //1.获取属性值 oldobj[k]
               var item=oldobj[k];
               //2.判断这个值是不是数组
               if(item instanceof Array){
                 newobj[k]=[];
                 //等于o.color=[],下一层;
                 deepCopy(newobj[k],item);
               }else if(item instanceof Object){
                  //3.判断是否为对象
                  newobj[k]={};
                  deepCopy(newobj[k],item);
               }else{
                 //4.判断是否为简单数据类型
                 //进行赋值
                 newobj[k]=item;
               }           
             }
         }
         deepCopy(o,obj);
         console.log(o);
  </script>

进行赋值 newobj[k]=item;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值