基本数据类型
基本数据类型深浅拷贝都一样,都是生成一个新的副本。
引用数据类型
浅拷贝
浅拷贝复制对象的引用也就是指针,两指针指向同一块内存空间
方法:Object.assign()
深拷贝
深拷贝复制对象的引用和内存空间,两指针指向不同的内存空间,两对象互不影响。而深拷贝还细分了两种情况:
深拷贝的浅拷贝
深拷贝的浅拷贝生成一个新指针指向新开辟的内存空间,但只拷贝最外面一层,里层的引用数据类型仍共享某块内存空间,所以当我们修改里层对象时会影响到拷贝对象。
方法:
1、扩展运算符
2、Array.concat()
3、Array.slice()
4、for in
痛点:内层引用指向同一块内存空间,所以当原对象修改了内层对象的值会影响到拷贝对象
深拷贝的深拷贝
深拷贝的深拷贝通过递归的方式一层一层的拷贝,最后使得拷贝对象与源对象完全解耦,互不影响。
1、使用第三方库,lodash.js
2、JSON.parse(JSON.stringify(targetObj))
痛点:
无法解决循环引用问题
无法拷贝特殊对象,RegExp,Date,Set,Map等
忽略undefined、symbol和函数
3、手写深拷贝
测试: