structuredClone 是目前处理复杂数据深拷贝最直接、最可靠的方式,一行代码即可完成,原生支持 Date、RegExp、Map、Set、ArrayBuffer、Blob、File、ImageData、Error(部分)、TypedArray 等类型及循环引用,但不支持函数、undefined、Symbol、WeakMap、WeakSet、DOM 节点、Promise、Proxy,且 class 实例会丢失原型信息。

structuredClone 是目前处理复杂数据深拷贝最直接、最可靠的方式,一行代码就能完成,且原生支持多数现代 JS 类型和循环引用。
支持哪些复杂数据类型
它能正确复制 Date、RegExp、Map、Set、ArrayBuffer、Blob、File、ImageData、Error(部分)、TypedArray 等,还能保留原始类型实例身份:
- Date:克隆后仍是 Date 实例,不是字符串
- RegExp:仍为 RegExp 对象,可正常使用 test/exec
- Map/Set:键值对结构完整保留,迭代顺序不变
- ArrayBuffer 及视图(Uint8Array 等):内存内容独立,修改互不影响
- 循环引用:自动识别并重建引用关系,不会栈溢出或报错
基础用法与注意事项
调用方式极简,但需留意几个关键限制:
- 直接调用 structuredClone(obj) 即可,无需额外配置
- 不支持函数、undefined、Symbol、WeakMap、WeakSet、DOM 节点、Promise、Proxy
- class 实例会被“扁平化”为普通对象,原型方法和 constructor 丢失
- 浏览器需 Chrome 98+ / Firefox 94+ / Safari 15.4+;Node.js 需 v17.0+(v16.14+ 启用 flag)
transfer 选项用于高性能场景
当处理大体积二进制数据(如视频帧、音频缓冲区)时,可用 transfer 实现零拷贝转移:
立即学习“Java免费学习笔记(深入)”;
- 传入 { transfer: [buffer] },原 ArrayBuffer 的 byteLength 变为 0
- 适用于向 Web Worker 传递大数据,避免内存翻倍
- 注意:transfer 后原对象不可再用,仅适用于一次性移交场景
兼容性兜底建议
若需支持旧环境或含不支持类型的数据,可组合使用:
- 先用 structuredClone 尝试,捕获 TypeError 后降级到自定义递归方案
- 对含函数或 Symbol 的对象,提前序列化关键字段,再用 structuredClone 处理纯数据部分
- 第三方库(如 lodash.cloneDeep)仍是稳定选择,尤其在 Node.js 早期版本或企业级项目中


















