题目 实现deepClone 例子
Object.assign()
可以用来前拷贝,而_.cloneDeep 在深度拷贝中非常有用。
你能否实现自己的_.cloneDeep()
?
lodash的实现囊括了多种数据类型,简单起见,该题目中你只需要支持:
-
基础数据类型 及其wrapper object。
-
简单Object(仅需处理可枚举属性)
-
数组Array
现已有built-in的 structuredClone(),不过为了练习用,请不要使用。
实现
function cloneDeep(data,map = new Map()){
//data为基本类型或者为null,注意 typeof null === 'object'
if(data === null || typeof data !== 'object') return data;
//检测是否循环引用
if(map.has(data)) return map.get(data);
let res = Array.isArray(data) ? [] : {};
map.set(data,res);
//获取所有可迭代的key,注意获取key类型为symbol的属性
const keys = [...Object.getOwnPropertySymbols(data),...Object.keys(data)];
for(let key of keys){
res[key] = cloneDeep(data[key],map);
}
return res;
}