美文网首页
Js浅拷贝以及深拷贝

Js浅拷贝以及深拷贝

作者: zsyyyyy | 来源:发表于2019-05-18 18:52 被阅读0次

    浅拷贝的实现原理:
    浅拷贝只会复制对象的指针,而不是复制对象本身,指针指向同一内存,新旧对象还是共享同一块内存,
    所以当复制一份过来,如 var obj2 = obj1;改变obj2的里面的属性,obj1也会随着改变。
    如图:


    13253432-aca35e0020358b3d.jpg

    下面来个例子:

    <script type="text/javascript">
            var obj = {
                a:1
            }
            console.log(a.a) //1
            var obj2 = obj;//复制obj1
            obj2.a=2;
            console.log(obj.a);//2  obj1里的a也会改变
        </script>
    

    深拷贝:它会创造出一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象
    下面来个例子:

    //创建一个对象
    var obj = {
        name:"小明",
        age:"12",
        skill:function(){
            console.log("123")
        },
       arr:["1","2","3"]
    }
    
    方式一:缺点:不能复制函数
    var   objStr = JSON.stringify(obj);//先将对象转为字符串
    var newObj = JSON. parse(objStr);//再将转的字符串转为obj对象
    console.log(newObj);
    

    运行结果如下:


    3e5577b2f615b1e58460f1cfc118d82.png

    从运行结果的到,通过JSON.stringify(),与JSON.parse()进行深拷贝,不能复制方法。

    方式二
    //创建一个对象
    var obj = {
        name:"小明",
        age:"12",
        skill:function(){
           console.log("123")
        },
       arr:["1","2","3"]
    }
    //首先创建一个空的对象,来装复制出来的对象
    var newObj = {};
        function deepcopy(obj,newObj){
             for(var i  in  obj){  //for...in遍历对象 i为键名
              if (typeof obj[i]==="object"){//判断这个属性是否对象 ===
                 //判断这个obj[i]为数组还是对象
                 newObj[i] = Array.isArray(obj[i])?[] :{};//newObj.arr = [] || {}   ,如果是数组或者对象,再创建一个空的数组或者对象装里面的元素或者键值对,
                 deepcopy(obj[i],newObj[i]);//然后再调用函数自己,用递归把数组或者数组中的每一个元素遍历出来
             }else{
               // newObj.name=小明
                newObj[i] = obj[i];//把原对象的键值对复制给新对象
              }
          }
         return newObj ;
       }
       var res = deepcopy(obj,newObj);//调用函数
       console.log(res);
    
       res.skill = function(){//改变新对象的方法,原对象方法不会随着改变
        console.log("9999");
       }
      obj.skill();
      res.skill();
      res.arr[0] = "888";//改变新对象的属性,原对象属性不会随着改变
      console.log(obj.arr);
      console.log(res.arr);
    

    var res = deepCopy(obj,newObj);//调用函数
    console.log(res);
    结果如图:


    eb830c4d8ef09cf322fdfc1cd47acfe.png

    相关文章

      网友评论

          本文标题:Js浅拷贝以及深拷贝

          本文链接:https://www.haomeiwen.com/subject/aqgtzqtx.html