现代项目优先用 structuredClone,但需确认环境支持;老系统或纯 JSON 数据场景仍可用 JSON.parse(JSON.stringify())。structuredClone 保留 Date、RegExp、Map 等原类型,支持循环引用和二进制数据,兼容 Chrome 98+ 等;JSON 方案在旧环境、POJO 场景及兜底时更可靠。使用前须运行时检测并校验输入值,注意其不保留原型链且大 ArrayBuffer 需 transfer 优化。

直接说结论:现代项目优先用 structuredClone,但得确认环境支持;老系统或纯 JSON 数据场景,JSON.parse(JSON.stringify()) 依然够用、更稳。
structuredClone 适合这些情况
它不是“升级版 JSON”,而是专为深拷贝设计的原生 API,优势集中在类型和结构上:
- 需要保留 Date、RegExp、Map、Set、ArrayBuffer、TypedArray、BigInt 的原始类型(JSON 会把 Date 变字符串、Map/Set 变空对象)
- 对象里有 循环引用(比如
obj.self = obj),structuredClone 能正确克隆,JSON 直接报错 - 处理二进制数据(如图像帧、音频缓冲区),且希望避免序列化成 base64 字符串带来的性能损耗
- 运行环境明确支持——Chrome 98+、Firefox 94+、Safari 15.4+、Node.js 18.13+(无需 flag)
JSON 方案仍有不可替代的场景
别因为“新”就盲目替换,它在特定条件下反而更可靠:
- 目标环境包含旧版 Safari(≤15.3)、IE 或某些 Electron 版本,structuredClone 不可用或有 bug(比如 Safari 15.2 对 BigInt 拷贝失败)
- 只操作纯数据对象(POJO):无函数、无 undefined、无 Symbol、无特殊类实例,这时 JSON 方法简单、轻量、无兼容风险
- 需要降级兜底逻辑时,JSON 方案更容易 fallback(比如加 try/catch 后直接走它),而 structuredClone 报错是硬性的 DataCloneError,兜底成本更高
用之前必须做的两件事
structuredClone 看似一行代码,但跳过这步容易线上翻车:
-
运行时检测 + 探测式兼容判断:不能只写
if ('structuredClone' in window),要加实际调用测试,例如:try { structuredClone({ x: 1n }); } catch (e) { /* 降级 */ } -
提前识别不支持的值:如果对象含
function、undefined、Symbol键/值、DOM 元素或原型链上有不可转移属性,structuredClone 会立刻抛错;JSON 虽然丢数据,但至少“静默成功”。建议在调用前做简易校验或文档约定输入格式
性能与取舍的真实边界
快不等于该用,关键看“快在哪”、“代价是什么”:
- 中等对象(~10KB 内),structuredClone 通常比 JSON 快 2–3 倍——省掉了字符串编解码开销
- 但拷贝大 ArrayBuffer(如几 MB 视频帧)会触发内存分配和字节复制,反而可能卡顿;此时可考虑
{ transfer: [buffer] }选项移交所有权,但注意原始 buffer 随即失效 - 它不保留原型链:class 实例拷贝后变成 plain object,constructor 是 Object,这点和 JSON 一样,如有继承需求需额外处理


















