// 深拷贝
function myDeepClone(target, map = new WeakMap()) {
// 判断基本类型还是引用类型
// null是object,如果是undefined直接返回吧
// 终点就是基本类型
if (typeof target !== 'object' || target === null || !target) {
return target
}
const targetConstructorName = target.constructor.name
if (/Function|RegExp/.test(targetConstructorName)) {
return new constructor(target)
}
// ❗️要先解决循环引用的问题,再创建新的数据,因为遇到复制过的数据,就直接返回
// 解决循环引用的问题
// ❗️这里要get的不是newTarget,而是target
if (map.get(target)) {
return map.get(target)
}
// 创建新的数据
const newTarget = Array.isArray(target) ? [] : {}
map.set(target, newTarget)
// 遍历+递归实现拷贝
Object.keys(target).forEach((key) => {
newTarget[key] = myDeepClone(target[key], map)
})
return newTarget
}