深度克隆

Posted baixiaoxiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度克隆相关的知识,希望对你有一定的参考价值。

浅拷贝和深度克隆:

举例子来说明:

浅拷贝:

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

 

以上是关于深度克隆的主要内容,如果未能解决你的问题,请参考以下文章

JS的深度克隆,利用构造函数原型深度克隆

Git克隆:克隆后增加深度[重复]

markdown Git浅克隆和克隆深度

java中的浅克隆和深克隆是啥

Java:深度克隆/复制实例的推荐解决方案

js 递归实现深度克隆与浅克隆