浅拷贝与深拷贝的理解

浅拷贝与深拷贝

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

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

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


我们先来看一个浅拷贝

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

那么什么是深拷贝呢
这里我们利用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