> 文章列表 > 43.深拷贝与浅拷贝

43.深拷贝与浅拷贝

43.深拷贝与浅拷贝

深拷贝实质上是拷贝要拷贝的对象自身,浅拷贝实质上是对要拷贝对象的引用。

当你浅拷贝复制A为B的时候,当数据类型复杂的时候,改动B会给A造成影响

当你深拷贝复制A为B的时候,任何时候,改动B都不会给A造成影响

如果只改动简单数据类型后,改动B会给A造成影响,那这个操作就不是拷贝

目录

1  直接用等号赋值不是拷贝

2  浅拷贝

2.1  扩展运算符

2.2  Object.assign()

2.3  concat()

2.4  浅拷贝的问题

3  深拷贝

3.1  递归函数

3.2  lodash库

3.3  JSON


1  直接用等号赋值不是拷贝

在复杂数据类型中,改动B会给A造成影响

如果是简单的数据类型,相当于之前给之前的赋值替掉了,所以不会造成影响

2  浅拷贝

2.1  扩展运算符

对象

数组

2.2  Object.assign()

2.3  concat()

2.4  浅拷贝的问题

当数据更加复杂的时候(比如对象套对象),改动B会给A造成影响

拷贝uname这种简单类型的时候,只改动栈中的内容,到了复杂数据类型的时候,需要改动了堆中内容,但栈中的内容不变,所以造成了改变B会对A造成影响

3  深拷贝

3.1  递归函数

原理是把所有的复杂类型都打碎成简单类型,然后一个一个赋值

  • 这里注意判断的时候要先写Array,如果先写Object,那么所有的元素就会判断为Object,因为数组也属于对象
  • 上面的函数可以满足大多数的情况,如果涉及到一些更复杂的情况,这个函数还是不行的

3.2  lodash库

lodash是一个JS库,我们可以使用lodash中的cloneDeep实现深拷贝

我这里用node安装了lodash,然后把lodash文件夹中的lodash.min.js拿出来

就像$代表jquery一样,_代表lodash

3.3  JSON

先由对象转换为字符串,字符串是简单类型,只有栈操作,然后将字符串转换为对象,此时虽然对象的内容一样,但他们是两个对象