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
}