JS深拷贝进阶版支持特殊对象类型Map、Set
2026/7/4 8:54:28 网站建设 项目流程

function deepClone(target: any, map = new WeakMap()) {
// 1. 基础类型直接返回
if (target === null || typeof target !== 'object') {
return target;
}

// 2. 处理循环引用
if (map.has(target)) {
return map.get(target);
}

// 3. 处理特殊对象
const type = Object.prototype.toString.call(target);

let cloneTarget: any;

switch (type) {
case '[object Date]':
return new Date(target);
case '[object RegExp]':
return new RegExp(target.source, target.flags);
case '[object Map]':
cloneTarget = new Map();
map.set(target, cloneTarget);
target.forEach((value: any, key: any) => {
cloneTarget.set(key, deepClone(value, map));
});
return cloneTarget;
case '[object Set]':
cloneTarget = new Set();
map.set(target, cloneTarget);
target.forEach((value: any) => {
cloneTarget.add(deepClone(value, map));
});
return cloneTarget;
default:
break;
}

// 4. 处理数组 / 对象
cloneTarget = Array.isArray(target)
? []
: Object.create(Object.getPrototypeOf(target));

map.set(target, cloneTarget);

// 5. 处理 Symbol + 普通 key
const keys = Reflect.ownKeys(target);

keys.forEach((key) => {
cloneTarget[key] = deepClone(target[key], map);
});

return cloneTarget;
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询