深拷贝 map 和 set 应优先使用 structuredclone(现代环境),或手动遍历重建(兼容旧环境),避免 json.stringify、直接构造及 weakmap/weakset 拷贝等陷阱。

JavaScript 中深拷贝 Map 和 Set 需要手动遍历并重建实例,因为 JSON.stringify() 会忽略它们,而多数浅层递归深拷贝工具(如 structuredClone 除外)默认不支持或需额外处理。
使用 structuredClone(推荐,现代环境)
structuredClone 是浏览器和 Node.js(v17.0+)原生支持的深拷贝 API,能自动正确处理 Map、Set、Date、RegExp、ArrayBuffer 等复杂类型。
- 直接调用即可,无需额外逻辑:
const copiedMap = structuredClone(originalMap); - 支持嵌套结构(如 Map 中存 Set,或对象里含 Map)
- 注意:不支持函数、undefined、BigInt(在部分旧版本)、循环引用(会抛错)
手动实现兼容性深拷贝(支持老环境)
当需要兼容不支持 structuredClone 的环境(如旧版 Node 或 IE),可扩展通用深拷贝函数,对 Map 和 Set 单独处理:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 检测类型:
value instanceof Map或value instanceof Set - 对
Map:新建Map,遍历entries(),递归拷贝 key 和 value - 对
Set:新建Set,遍历values(),递归拷贝每个元素 - 示例片段:
if (value instanceof Map) {<br> return new Map(Array.from(value, ([k, v]) => [deepClone(k), deepClone(v)]));<br>}<br>if (value instanceof Set) {<br> return new Set(Array.from(value, item => deepClone(item)));<br>}
避免常见陷阱
深拷贝 Map/Set 容易踩坑,需特别注意:
-
JSON.stringify(map)返回空对象{},完全丢失数据 → 切勿用于 Map/Set - 直接
new Map(originalMap)是浅拷贝,内部引用未分离 → key/value 仍是原引用 - WeakMap / WeakSet 无法安全深拷贝(设计上不可枚举、不支持遍历),通常应避免尝试拷贝
- 自定义类实例若继承自 Map/Set,需检查其构造方式,可能需重写
toJSON或自定义克隆方法
第三方库选择参考
如使用 Lodash 或 other 工具库:
-
_.cloneDeep(Lodash)默认支持 Map/Set(v4.17.0+),内部已做类型判断和重建 - 注意:某些轻量库(如
fast-deep-equal)只做比较,不提供拷贝能力 - 使用前确认文档是否声明支持 Map/Set,避免隐式降级为 {} 或 []
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










