export function deepClone(target, map = new Map()) {
// 基本数据类型直接返回
if (typeof target !== 'object') {
return target
}
// 引用数据类型特殊处理
// 判断数组还是对象
const temp = Array.isArray(target) ? [] : {}
if (map.get(target)) {
// 已存在则直接返回
return map.get(target)
}
// 不存在则第一次设置
map.set(target, temp)
for (const key in target) {
// 递归
temp[key] = deepClone(target[key], map)
}
return temp
}
环引用例子:
const a = {
nickname: 'einekleine',
}
a.children = a // 环引用
const b = deepClone(a)
console.log(b)
{
nickname: 'einekleine',
children: [Circular]
}
console.log(b === a) // false