zoukankan      html  css  js  c++  java
  • js的深复制和浅复制

    在弄项目的时候我们可能会遇到将一个对象复制给另外一个对象的情况,对象的复制不像基本类型那样简单的进行复制,因为对象是保存的堆内存中,如果只是简单的复制的话,如果其中一个对象的属性改变了,会造成另外一个对象的属性也会跟着改变,这是不允许出现的,这里介绍对象复制的几种情况:

    1.对象是数组的情况

    如果已经确定了是数组对象,那么可以直接使用数组的一些特有属性,例如slice,concat等等,因为它们只是返回一个数组的副本,不会改变原数组

    例如:

    arr=[1,2,3,4]

    arr1=arr.slice(0);

    arr1.push(5);

    console.log(arr) .........[1,2,3,4];

    2.对象里面既有基本类型也有数组类型的情况

    这个可以分为两种情况,深复制和浅复制

    深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用

    1)深复制在计算机中开辟了一块内存地址用于存放复制的对象,
    2)而浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。

    所谓的浅复制,只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”。

    看看浅复制

    var json1 = {"a":"李鹏","arr1":[1,2,3]}
    function copy(obj1) {     
           var obj2 = {};
       for (var i in obj1) {       
                    obj2[i] = obj1[i];     
               }     
              return obj2;
    }
    var json2 = copy(json1);
    json1.arr1.push(4);
    alert(json1.arr1); //1234
    alert(json2.arr1) //1234对于数组部分还是引用了
     
    再看看深复制

    而深复制的话,我们要求复制一个复杂的对象,那么我们就可以利用递归的思想来做,及省性能,又不会发生引用。

    var json1={"name":"鹏哥","age":18,"arr1":[1,2,3,4,5],"string":'afasfsafa',"arr2":[1,2,3,4,5],"arr3":[{"name1":"李鹏"},{"job":"前端开发求职"}]};
    var json2={};
    function copy(obj1,obj2){
           var obj2=obj2||{}; //最初的时候给它一个初始值=它自己或者是一个json
           for(var name in obj1){
                if(typeof obj1[name] === "object"){ //先判断一下obj[name]是不是一个对象
                      obj2[name]= (obj1[name].constructor===Array)?[]:{}; //我们让要复制的对象的name项=数组或者是json
                     copy(obj1[name],obj2[name]); //然后来无限调用函数自己 递归思想
                }else{
                      obj2[name]=obj1[name]; //如果不是对象,直接等于即可,不会发生引用。
                }
            }
           return obj2; //然后在把复制好的对象给return出去 }
    json2=copy(json1,json2)
    json1.arr1.push(6);
    alert(json1.arr1); //123456
    alert(json2.arr1); //12345

    详细地址可以看看:http://www.jianshu.com/p/0d7bd31ccf43
     

     

  • 相关阅读:
    索引虚拟oracle virtual index
    用户盘云存储——百度网盘
    数据类型泛型的嵌套使用
    函数返回值C语言中malloc函数返回值是否需要类型强制转换问题
    控制文件oracle controlfile structure
    程序语言POJ 2406 Power Strings
    数组信息[置顶] php数组转换js数组操作及json_encode应用
    代码电话《程序员的第一年》情感编
    泛型通配符泛型中使用 通配符
    数字字符串一道有道实习生笔试算法题分析
  • 原文地址:https://www.cnblogs.com/yanzai/p/7458814.html
Copyright © 2011-2022 走看看