首页 > 其他 > 详细

浅拷贝与深拷贝的理解

时间:2020-03-15 23:48:31      阅读:79      评论:0      收藏:0      [点我收藏+]

浅拷贝与深拷贝

首先我们要知道什么是浅拷贝和深拷贝

浅拷贝:拷贝的值改变时原来的值跟着一起改变。

深拷贝:拷贝的值可以无限层拷贝,拷贝值与原始值不发生任何影响


我们先来看一个浅拷贝


技术分享图片

可以看到,我们拷贝的值发生改变时,原始值也在发生改变。

那么什么是深拷贝呢
这里我们利用json的属性即可完成深拷贝。
注意:json只能拷贝object和array,不能拷贝function。


技术分享图片

拷贝值与原始值不发生任何影响

到这里你可能会想,浅拷贝改变值相互影响,深拷贝不相互影响,很简单嘛。

我们再来看一个例子


技术分享图片

你不是说浅拷贝是互相影响的嘛?为什么这里a.c和b.c不相同呢?
这里要注意,当object只有一层时是深拷贝

有人可能回想,浅拷贝中既然互相影响,那么他们指向的应该是同一个值吧。
这里只说对了一半,我们都知道object是引用类型,引用类型存放在堆内存中,原始类型存放在栈内存中,这里很明显是引用类型。
在堆内存中(引用类型),拷贝的值储存的是引用地址,而不是值。所以当引用地址的内容发生改变时,所有指向内存地址的变量都发生改变。

这里我们进行打印一下,如果引用地址相同两个变量应相等。


技术分享图片

正好验证了,当object只有一层时是深拷贝,两个值不相等。
其他层拷贝则都是浅拷贝。

所以,我们判断两个值是否是浅拷贝时,还可以通过两个变量是否相等来判断。

总结

  1. 浅拷贝:拷贝的值改变时原来的值跟着一起改变,注意当object只有一层时是深拷贝。
  2. 深拷贝:拷贝的值可以无限层拷贝,拷贝值与原始值不发生任何影响。
  3. 使用JSON深拷贝时,只能进行拷贝对象或数组,不能拷贝函数,如果拷贝函数要使用递归的方式。
  4. 如果两个变量的指针相等,则是浅拷贝。

浅拷贝与深拷贝的理解

原文:https://www.cnblogs.com/lovecode3000/p/12500911.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!