JS 实现深拷贝函数

44 阅读1分钟
function deepClone(obj, map = new Map()){
    if (obj == null) return obj
    const dataType = Object.prototype.toString.call(obj)
    // 日期
    if (dataType == '[object Date]') return new Date(obj)
    // 正则
    if (dataType == '[object RegExp]') return new RegExp(obj)
    // 可能是对象或者普通的值  如果是函数的话是不需要深拷贝
    if (typeof obj != 'object') return obj
    // 是对象的话进行深拷贝
    if (map.get(obj)) return map.get(obj)
    // 找到所属类原型上的constructor,而原型上的constructor指向的是当前类本身
    const cloneObj = new obj.constructor() // 可能是数组或者对象?
    // 防止循环引用
    map.set(obj, cloneObj)
    for (const k in obj){
        // 保证 key 不是原型属性
        if (obj.hasOwnProperty(k)){
            // 递归拷贝
            cloneObj[k] = deepClone(obj[k], map)
        }
    }
    return cloneObj
}