structuredclone能完整深拷贝map和set,保持类型、结构及嵌套关系,键值均为独立副本;不支持函数、undefined、非全局symbol等会抛datacloneerror;循环引用可正确处理。

structuredClone 会完整深拷贝 Map 和 Set 中的键与值,保持类型不变,且彼此独立。它不是简单复制引用,而是对每个键、每个值都递归执行结构化克隆——包括嵌套的 Map、Set、Date、对象、数组等,只要它们属于支持类型。
键和值都被真正“复制”,不是共享
原 Map 中用一个 Set 作 key,克隆后这个 key 是全新实例;原 Set 中存了一个对象,克隆后的 Set 里对应的是该对象的深拷贝副本。两者内存地址不同,修改原对象不会影响克隆体,反之亦然。
- cloned instanceof Map 返回 true,类型保留
- cloned.get(originalKey) === undefined —— 因为 originalKey 是另一个实例,无法命中
- cloned.has(clonedKey) === true —— 克隆体自己的 key 能正常匹配
- 如果原 Map 的 value 是 { x: new Date() },克隆后 value.x 仍是 Date 实例,.getTime() 可正常调用
嵌套集合也能逐层还原
比如 Map 的某个 value 是另一个 Map,而那个 Map 的 key 又是一个 Set,structuredClone 会一层层向下处理,确保每层的 Map/Map/Set/对象都生成独立副本,结构完全对齐。
- const nested = new Map([['inner', new Map([[new Set([1]), 'val']])]]);
- const cloned = structuredClone(nested);
- cloned.get('inner') instanceof Map → true
- cloned.get('inner').get(new Set([1])) → undefined(原 Set 不匹配)
- const keyFromCloned = cloned.get('inner').keys().next().value; cloned.get('inner').has(keyFromCloned) → true
不支持的键或值会直接报错
如果 Map 或 Set 中含有函数、undefined、Symbol(非 Symbol.for)、Promise 或 WeakMap 等,structuredClone 会在运行时抛出 DataCloneError,而不是静默忽略或转换失败。
- new Map([[function(){}, 'bad']]) → 报错
- new Set([undefined]) → 报错
- new Map([[Symbol('s'), 'also bad']]) → 报错(Symbol 不可序列化)
- 但 new Map([[Symbol.for('ok'), 'good']]) → 可成功(Symbol.for 创建的全局 Symbol 可克隆)
循环引用在集合中也照常处理
Map 自己作为自己的 key,或 Set 包含自身,structuredClone 都能识别并重建引用关系,不会卡死或丢失数据。
- const m = new Map(); m.set('self', m); m.set(m, 'cycle');
- const c = structuredClone(m); c.get('self') === c → true
- c.get(c) → 'cycle'











