老生常谈之cloneDeep

1,402 阅读1分钟

题目 实现deepClone 例子 Object.assign() 可以用来前拷贝,而_.cloneDeep 在深度拷贝中非常有用。

你能否实现自己的_.cloneDeep()?

lodash的实现囊括了多种数据类型,简单起见,该题目中你只需要支持:

  1. 基础数据类型 及其wrapper object。

  2. 简单Object(仅需处理可枚举属性)

  3. 数组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;
}