深拷贝实现

不考虑正则、函数等奇怪类型的拷贝,满足大多数深度拷贝需求
定制需求如下:
1、循环引用
2、Symbol 类型拷贝

function deepClone(val,map = new WeakMap()){
    if(val === null || typeof val !=='object') return val;
    //循环引用
    if(map.has(val)) return map.get(val);
    let clone = Array.isArray(val) ? [] : {};
    map.set(val,clone);
    // 获取对象中所有的属性名(包含Symbol值)
    let keys = Reflect.ownKeys(val);(可换为:Object.keys(val).concat(Object.ownPropertySymbols(val))let len = keys.length;
    while(len--){
        clone[keys[len]] = deepClone(val[keys[len]],map);
    }
    return clone;
}
posted @ 2022-06-28 08:40  下一秒钟已经不同  阅读(184)  评论(0编辑  收藏  举报