SOURCE

function deepClone(obj,map = new WeakMap()){
    if(typeof obj !=='object'|| obj ===null) return obj;
    let objFromMap = map.get(obj);
    if(objFromMap) return objFromMap;
    let target ={};
    map.set(obj,target)
    if(obj instanceof Map){
        target = new Map();
        obj.forEach((v,k)=>{
            const v1 = deepClone(v,map);
            const k1= deepClone(k,map);
            target.set(k,v)
        })
    }
    if(obj instanceof Set){
        target = new Set();
        obj.forEach((v)=>{
            target.add(deepClone(v),map)
        })
    }
    if(obj instanceof Array){
        target = obj.map(item=>{
           return deepClone(item,map)
        })
    }
    if(obj instanceof RegExp) { return new RegExp(obj) }
    if(obj instanceof Date) { return new Date(obj) }
    for(let key in obj){
            target[key]=deepClone(obj[key],map);
        }
    return target;
}

let obj1 ={
    a:1,
    b:[2,3,4],
    c:function(){
        console.log(1)
    },
    e:new Date(),
    d:new Map([[1,2],[true,3]]),
    f:new Set([1,3,4,5]),
}
let res = deepClone(obj1);
console.log(res);


// function cloneDeep(obj, map = new WeakMap()) {
//     if (typeof obj !== 'object' || obj == null ) return obj

//     // 避免循环引用
//     const objFromMap = map.get(obj)
//     if (objFromMap) return objFromMap

//     let target = {}
//     map.set(obj, target)

//     // Map
//     if (obj instanceof Map) {
//         target = new Map()
//         obj.forEach((v, k) => {
//             const v1 = cloneDeep(v, map)
//             const k1 = cloneDeep(k, map)
//             target.set(k1, v1)
//         })
//     }

//     // Set
//     if (obj instanceof Set) {
//         target = new Set()
//         obj.forEach(v => {
//             const v1 = cloneDeep(v, map)
//             target.add(v1)
//         })
//     }

//     // Array
//     if (obj instanceof Array) {
//         target = obj.map(item => cloneDeep(item, map))
//     }

//     // Object
//     for (const key in obj) {
//         const val = obj[key]
//         const val1 = cloneDeep(val, map)
//         target[key] = val1
//     }

//     return target
// }

// 功能测试
// const a = {
//     set: new Set([10, 20, 30]),
//     map: new Map([['x', 10], ['y', 20]]),
//     info: {
//         city: '北京'
//     },
//     fn: () => { console.info(100) }
// }

// console.log( deepClone(a) )
console 命令行工具 X clear

                    
>
console