码迷,mamicode.com
首页 > 其他好文 > 详细

深度克隆

时间:2019-03-29 23:30:37      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:存在   深度克隆   ssi   ring   数组   gif   相互   val   ice   

浅拷贝和深度克隆:

举例子来说明:

浅拷贝:

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

 

深度克隆

标签:存在   深度克隆   ssi   ring   数组   gif   相互   val   ice   

原文地址:https://www.cnblogs.com/baixiaoxiao/p/10624686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!