深浅拷贝的区别:
区别在于被拷贝对象的值为引用型时,拷贝的是该对象栈中存储的指针地址,该地址指向堆中存储数据的具体位置,而非开辟一个新的堆内存空间来存储被拷贝对象的具体数据。这种情况就是浅拷贝,反之则是深拷贝。
因为浅拷贝拷贝的是栈中存储的指针地址,而非数据本身,所以原对象有任何变化都会导致拷贝出来的新对象也跟着变化。
实现深拷贝的方法:
1:JSON.parse(JSON.stringify())
优点:
简单易用,能覆盖大多数场景。
缺点:
❀ 对于一些值为特殊类型的数据是无法拷贝的,如Symbol、Set、Map、Function、RegExp。
❀ 对于循环引用的对象实施拷贝的时候会出现无限递归的情况,造成栈溢出。
❀ 无法拷贝对象原型上的属性
2:自定义递归函数完美拷贝目标对象
注:这里没有进行原型拷贝,如果需要拷贝原型上的属性可以通过Object.getPrototypeOf()方法取出对象原型上的属性然后放入新对象上即可。