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)): 数组或对象深拷贝, 但不能处理函数数据

  • 相关阅读:
    C语言中指针*p[N], (*P)[N],及**p的区别
    一个酷炫的,基于HTML5,Jquery和Css的全屏焦点图特效,兼容各种浏览器
    day10函数作业详解
    day9函数作业详解
    day7计算作业详解
    day6作业详解
    通过Web安全工具Burp suite找出网站中的XSS漏洞实战(二)
    使用Docker快速部署ELK分析Nginx日志实践(二)
    java 字符串转运算符
    生成给定范围的n随机整数
  • 原文地址:https://www.cnblogs.com/baixiaoxiao/p/10624686.html
Copyright © 2011-2022 走看看