2019-07-08

深拷贝

对于前端开发者来说,我们几乎无时无刻都在接触对象。说起对象就不得不说起引用数据类型。所谓引用数据类型就是在js中,对象是放在堆内存中,栈中只是存放着对象对在堆内存中的存放地址。因此,当我们对对象进行赋值的时候,只要不改变对象的引用地址,所有的对象都会跟着改变。这当然我们想要的效果,有时候我们需要保存一份初始数据,如果初始数据跟着赋值对象一起改变肯定就不行了。因此,也就出现了深拷贝和浅拷贝一说,所谓深拷贝就是赋值对象不会随着被赋值对象改变而改变,反之就是浅拷贝。实现深拷贝很简单,我们为每一个对象都重新开辟一块新的内存,自然内存地址也就跟赋值对象不一样,也就不会影响到初始赋值数据。
下面我们先来看一下浅拷贝的几个例子:


image.png

image.png

大家可以看到,使用Object.assign来进行对象复制的时候,它只能深拷贝第一层对象属性,第二层或者更深的层次无法进行深拷贝,所以Object.assign最好只用于单层对象的拷贝。

实现深拷贝

要想不出现Object.assign这种只能进行一层拷贝的局限性,我们来实现一个深拷贝函数对每一层都进行深拷贝。

function deepClone(obj){
if(typeof obj ==="object"&&obj ){
var data=Array.isArray(obj)?[]:{};
for(var prop in obj){
data[prop]=deepClone(obj[prop])
}
return data
}else {
return obj
}
}

大家可以自己尝试一下,无论是多少层对象,均能够完美copy,并且不会影响初始赋值对象。实现深拷贝的需要注意一点的就是,在递归赋值的过程中,要注意数组对象和对象的赋值。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 5,527评论 0 1
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 6,632评论 0 12
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 6,070评论 1 16
  • 夜行讨赖河畔,未遇一人。华灯千盏,为我一人点亮,帝王待遇也哉! 想汉武帝千古一帝,夜游未央宫,燃油烧烛,宫人掌灯,...
    行吟斯基阅读 3,471评论 0 2

友情链接更多精彩内容