深拷贝Map/Set需保持类型和结构独立,优先用structuredClone();旧环境需手写递归实现并用WeakMap防循环引用;JSON和扩展运算符均失效。

处理 Map 和 Set 的深拷贝,关键不是“能不能复制”,而是“复制后是否保持类型和结构独立”。Map 和 Set 不是普通对象,它们的键值对、迭代顺序、引用行为都特殊,用 JSON.parse(JSON.stringify()) 会直接变成空对象,必须用支持原生结构的方案。
优先用 structuredClone() —— 现代浏览器标准解法
Chrome 98+、Firefox 94+、Safari 15.4+ 已原生支持,能完整保留 Map/Set 的类型、键值、嵌套关系,且自动处理循环引用:
- Map 实例拷贝后仍是
Map,cloned instanceof Map返回true - Set 实例拷贝后仍是
Set,所有元素被递归深拷贝(包括 Set 里的对象、数组等) - 键为对象或 Set 的情况也能正确处理(注意:原 Map 中用
new Set([1,2])作键,拷贝后该键已变,需用新键查询) - 不支持
function、undefined、Symbol作为键或值,遇到会抛DataCloneError
兼容旧环境时手写递归实现
若需支持 IE 或低版本 Node.js,需手动识别类型并分别构造:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 检测类型用
Object.prototype.toString.call(obj) === '[object Map]',比typeof可靠 - Map 拷贝:新建
Map,遍历原 Map 的entries(),对每个键和值都递归深拷贝后再set() - Set 拷贝:新建
Set,遍历原 Set 的values(),逐个递归拷贝后add() - 必须用
WeakMap记录源对象→拷贝对象映射,防止 Map/Set 内部含循环引用时无限递归
避免踩坑的实操提醒
Map 和 Set 的深拷贝容易忽略几个细节:
立即学习“Java免费学习笔记(深入)”;
-
JSON 方案完全失效:
JSON.stringify(new Map([[1, 'a']]))返回{},不可用于任何生产逻辑 -
扩展运算符不起作用:
{...myMap}或[...mySet]得到的是数组或对象,丢失 Map/Set 类型和方法 -
浅拷贝无意义:
new Map(myMap)或new Set(mySet)只是“重包装”,内部键值仍共享引用 - 注意键的相等性:Map 拷贝后,原对象作键查不到值,因为键已被深拷贝成新对象(引用不同)

















