深拷贝、浅拷贝的实现

深浅拷贝的区别:
浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。
深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变。
深拷贝、浅拷贝的实现_第1张图片
深拷贝、浅拷贝的实现_第2张图片
结果:

一次构造

两次析构

深拷贝、浅拷贝的实现_第3张图片
编译系统在我们自己没有自定义拷贝构造函数时,会在拷贝对象时候调用默认拷贝构造函数,进行浅拷贝,即对指针name拷贝后出现两个指针指向同一个内存块。所以析构时候就析构了两次,导致内存泄漏。
深拷贝、浅拷贝的实现_第4张图片
所以在对“含有指针成员的对象”进行拷贝时,必须要自己定义拷贝构造函数,使拷贝构造后的对象指针成员有自己的内存空间,即进行深拷贝,避免内存泄漏。
深拷贝、浅拷贝的实现_第5张图片
深拷贝、浅拷贝的实现_第6张图片
test.cpp
深拷贝、浅拷贝的实现_第7张图片

结果:

构造一次

拷贝构造一次

析构两次
深拷贝、浅拷贝的实现_第8张图片
综上所述,浅拷贝是只对指针进行拷贝,两个指针指向同一个内存块,深拷贝是对指针和指针指向的内容都进行拷贝,拷贝后的指针是指向不同内的指针。

深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。

深拷贝

  • 深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响,
    对一个对象的修改并不会影响另一个对象。

浅拷贝

  • 浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
  • 可 以 使 用
  • for in 、
  • Object.assign 、
  • 扩 展 运 算 符 …
  • Array.prototype.slice()、
  • Array.prototype.concat() 、递归等递归函数实现深拷贝

你可能感兴趣的:(JavaScript,Vue.js)