zoukankan      html  css  js  c++  java
  • 深度克隆

    浅拷贝和深度克隆:

    举例子来说明:

    浅拷贝:

    var a=1;

    var b=a;

    a=2;

    console.log(b)//此处输出1

    这就是浅拷贝,对于基本数据类型,就是赋值操作,只存在浅拷贝,而对于引用数据类型来说浅拷贝往往不能满足我们的需求:

    例如:

    var obj={name:'jack',age:18}

    var obj2=obj1

    obj.name='rose'

    console.log(obj2.name)//此处输出的是'rose'

    这就是引用数据类型的浅拷贝,拷贝的对象与被拷贝的对象是相互牵制的,修改其中一个的属性另一个也会改变,因为他克隆的是引用地址值

    所以,我们就需要深度克隆来实现让两个对象相互独立,不收影响

    方法:

    const obj={name:'jack'}

    let obj2={}

    Object.assign(obj2,obj1)

    这是es6提出的一个方法,也只是实现一层的克隆,当属性的值还是对象或者数组的时候就无法实现了

    所以我们需要自己封装一个深度克隆的方法:

    function checkType(obj){

      return Object.prototype.toString.call(obj).slice(8,-1)

    }//检查数据类型的函数

    function deepClone(obj){

      let newObj=null;

      let type=checkType(obj)

      if(type==='Object'){

        newObj={}

      }else if(type==='Array'){

        newObj=[]

      }else{

        return 

      }

      

      for(let key in obj){

        const value=obj[key]

        if(checkType(value)==='object' || 'Array'){

          newObj[key]= deepClone(value);

        }else{

          newObj[key]=value;

        }

      }

        return newObj

    }

    常用的拷贝技术还有:

    arr.concat(): 数组浅拷贝

    arr.slice(): 数组浅拷贝

    JSON.parse(JSON.stringify(arr/obj)): 数组或对象深拷贝, 但不能处理函数数据

  • 相关阅读:
    使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果
    Android 实现文件上传功能(upload)
    Hibernate配置文件
    ICMP报文分析
    AVC1与H264的差别
    内存泄漏以及常见的解决方法
    数据挖掘十大经典算法
    关于java的JIT知识
    Ubuntu安装二:在VM中安装Ubuntu
    hdu 1520Anniversary party(简单树形dp)
  • 原文地址:https://www.cnblogs.com/baixiaoxiao/p/10624686.html
Copyright © 2011-2022 走看看