前言
*在js中,数组和对象的复制如果使用=
号来进行复制,那只是浅拷贝。如下图演示: *
如上,arr
的修改,会影响arr2
的值,这显然在绝大多数情况下,并不是我们所需要的结果。
因此,数组以及对象的深拷贝就是javascript
的一个基本功了。
ps:要实现完全的深层次拷贝,既拷贝所有层级的属性。并且不会丢失数据。只有一种方法,那就是递归遍历所有层。
function deepCopy(obj) {
let clonedObj;
// 判断直接数据类型
if (['number', 'string', 'boolean', 'undefined', 'symbol',].includes(typeof obj)
|| obj === null) {
clonedObj = obj;
return clonedObj;
}
const constructor = obj.constructor || Object;
clonedObj = new constructor();
Object.entries(obj).forEach(([key, value]) => {
clonedObj[key] = deepCopy(value);
})
return clonedObj;
}
可能很多人说有很多方法啊,JSON.stringify然后再JSON.parse,这个方法其实也是深拷贝,但是有如下风险
- 1、如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式,而不是对象的形式
- 2、如果obj里面有RegExp,则打印出来是空对象
- 3、如果对象中有函数或者undefined,则会直接被丢掉
- 4、如果json里有对象是由构造函数生成的,则会丢掉对象的constructon
- 5、如果对象中存在循环引用的情况也无法正确实现深拷贝
- 6、如果对象中存在NAN,则序列化后会变成null
网友评论