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