structuredClone靠明确支持范围和显式报错防数据丢失,只克隆规范白名单类型(如Date、Map、ArrayBuffer等),遇函数、Error、DOM节点等不可克隆值直接抛DataCloneError,不静默降级或部分克隆。

structuredClone 不靠“容错”来保护数据,而是靠“明确支持范围 + 显式报错”来防止隐性丢失。它不尝试转换不可克隆值,也不静默跳过,而是直接中断并抛出 DataCloneError,让你立刻知道哪里出了问题。
只克隆规范明确认可的类型
它不是“尽力而为”,而是严格按 HTML 规范执行:只有被标准列入白名单的类型才允许通过。比如:
- Date、RegExp、Map、Set、ArrayBuffer、TypedArray、Blob、File、ImageData 等——原类型重建,行为完整保留
- null、undefined、boolean、number、string、bigint——照常复制
- Symbol(仅限
Symbol.for()创建的全局符号)——可克隆;普通 Symbol 键在对象中会被忽略,但不会导致整个克隆失败
拒绝静默降级,用错误代替失真
传统 JSON 方案的问题在于“看起来成功,实际已损坏”:Date 变字符串、Map 变空对象、函数被删、undefined 消失……这些都无提示。structuredClone 则相反:
- 遇到函数、Promise、Error、DOM 节点、WeakMap/WeakSet —— 直接抛
DataCloneError - 遇到含不可克隆值的对象(如
{ a: new Date(), b: () => {} })——整体会失败,不会只克隆a而丢掉b - 循环引用能正确处理,不爆栈也不丢数据;但若结构中混入不支持项,仍会报错
对边界情况保持透明
它不隐藏限制,反而把约束显性化:
立即学习“Java免费学习笔记(深入)”;
- 对象上的 getter/setter 不会被执行,也不会被克隆定义——克隆后只剩数据属性
- 自定义类实例(非内置类型)会被当作普通对象处理,原型方法和内部槽位丢失,但不会报错(除非实例内含函数或 WeakMap)
- FormData 需先转为键值对再克隆;直接传 FormData 实例在部分浏览器中可能不被支持
配合使用才能真正防丢
structuredClone 本身是守门员,不是修复器。要真正避免数据丢失,还需主动配合:
- 克隆前做轻量校验:检查是否含函数、Error 或 DOM 引用
- 对业务关键字段(如表单中的上传文件 + 自定义元数据),把元数据抽离到独立字段,而非挂载在 Blob 上
- 在 Worker 通信等场景中,优先用 structuredClone 处理后再 postMessage,避免依赖 postMessage 自动克隆的兼容性差异


















