深浅拷贝的终结
废话不多说,今天让我们来实现先深拷贝和浅拷贝
浅拷贝
浅拷贝是最常见的,我们通常对复杂类型的赋值操作基本就是浅拷贝。例如
这样修改hobby对象里的复杂类型的值时,copy对象对应的值也会改变
这里的hobby对象的mes中的num改变,copy中的也改变了
现在让我们来封装一个方法来实现浅拷贝
利用for in循环遍历key值赋值给新对象的相应属性
我们可以发现id值就hobby变了,mes.num则是全变 说明成功实现浅拷贝了
我们修改基本类型的值是不会影响拷贝的,修改复杂类型就会发生改变,原理就是,浅拷贝复制的只是一个引用地址,并没有在内存里面开辟一块新空间用来存放,所以当发生修改的时候,引用该地址的数据将会发生对应改变。
ES6提供了一种浅拷贝的方法 Object.assign(newObj,oldObj)
原理就是我们上面手写的方法
深拷贝
深拷贝简单来说就是更深层次的拷贝
标准说法就是 拷贝复杂类型时会重新开辟一块空间来储存复杂类型数据的值,使得它们之间没有任何联系,不会相互影响。
抽象点说就是 像对象,数组这样的类型,深拷贝就是先创建一个空的对象或者数组,然后再把值一个个扔进去,如果值里有数组或者对象则又重复上一次操作,直到都是基本类型的值就执行赋值操作。
我们来手写实现:
深拷贝实现
判断是数组还是对象,因为数组类型也属于对象,所以数组先判断。数据给个空数组,对象给个空对象,再用递归再执行一次,把该数组或对象里的值再判断一次,直到全是基本类型的值(中途有基本类型的就直接执行赋值),执行赋值即可以。
我们来修改里面数组中的对象的值,发现修改并不会影响后面拷贝的数据
这样我们的深拷贝就实现了!是不是so easy~