map必须单独处理深拷贝,因它非普通对象,不支持for...in或object.keys()遍历,键可为任意类型,需instanceof判断后用entries()遍历并递归克隆键值对,同时用weakmap防循环引用。

Map 类型必须单独判断和重建
JavaScript 中的 Map 不是普通对象,不能通过 for...in 或 Object.keys() 遍历,它的键值对存储在内部槽中,且支持任意类型作为键(包括对象、函数、Symbol 甚至另一个 Map)。所以手写深拷贝时,必须显式识别 obj instanceof Map,并用新 Map 实例承载递归处理后的键值对。
递归复制 Map 的关键步骤
核心逻辑是:遍历原 Map 的每一组 [key, value],对 key 和 value 分别执行深拷贝,再 set 到新 Map 中。注意 key 也要深拷贝——尤其当 key 是对象或嵌套结构时,否则新旧 Map 可能意外共享引用。
- 先判断
obj instanceof Map,成立则新建const clone = new Map() - 调用
obj.entries()获取迭代器,避免依赖forEach的 this 绑定问题 - 对每个
[k, v],递归调用deepClone(k)和deepClone(v) - 用
clone.set(克隆后的 key, 克隆后的 value)写入新 Map - 记得把新 Map 存入 WeakMap 缓存,防止循环引用(例如 Map 中的某个 value 又指向该 Map 自身)
完整代码片段(含 Map 支持)
以下为整合进通用 deepClone 函数的 Map 处理部分:
function deepClone(obj, hash = new WeakMap()) {if (obj === null || typeof obj !== 'object') return obj;
if (hash.has(obj)) return hash.get(obj);
if (obj instanceof Map) {
const clone = new Map();
hash.set(obj, clone);
for (const [k, v] of obj.entries()) {
clone.set(deepClone(k, hash), deepClone(v, hash));
}
return clone;
}
// 后续继续处理 Array、Object、Date、Set 等...
}
为什么不能用 Object.fromEntries + JSON?
Object.fromEntries(map) 只能转成普通对象,丢失 Map 特性(如非字符串键、插入顺序保证、size 属性);而 JSON.stringify 根本无法序列化 Map,会得到空对象 {}。这两种方式都属于“降级转换”,不是真正的深拷贝,遇到 Map 必须走原生构造 + 递归重建路径。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











