structuredClone能拷贝Date、RegExp、Map、Set、ArrayBuffer、TypedArray、BigInt及循环引用对象,但不支持function、undefined、Symbol;需检测兼容性并降级;不保留原型链。

structuredClone 能拷贝哪些 JSON 不能处理的值
它能直接复制 Date、RegExp、Map、Set、ArrayBuffer、TypedArray、BigInt,甚至带循环引用的对象——而 JSON.stringify + JSON.parse 会丢掉类型、抛错或静默失败。
比如:structuredClone(new Map([['a', 1]])) 返回一个新 Map;JSON.parse(JSON.stringify(...)) 只能得到空对象 {}。
注意:function、undefined、Symbol 仍不被支持,和 JSON 一样会被忽略或报错(structuredClone 遇到 function 直接抛 DataCloneError)。
浏览器兼容性与降级判断必须做
structuredClone 在 Chrome 98+、Firefox 94+、Safari 15.4+ 才可用,旧版 Safari 和部分 Electron 版本根本没这个函数。
别只写 if ('structuredClone' in window) —— Safari 15.2 有该函数但内部实现有 bug(对 BigInt 拷贝失败),建议加简单探测:
try {
structuredClone({ b: 1n });
} catch {
// 降级到 lodash.cloneDeep 或自定义 fallback
}
Node.js 从 v17.0 开始支持,但需启用 --experimental-structured-cloning 标志;v18.13+ 默认启用。
它不是万能的,这些场景会直接报错
以下任何一项存在,structuredClone 都会立刻抛 DataCloneError:
- 含有
function属性(哪怕只是对象方法) - 包含
undefined字段({ x: undefined }) - 含
Symbol键或值 - 原型链上挂了不可枚举/不可转移属性(如某些 polyfill 添加的
__proto__) - 传入
window、document等宿主对象
对比 JSON:它至少还能“假装成功”(把 undefined / function 删掉),而 structuredClone 是硬性拒绝,错误更明确但也更难兜底。
性能比 JSON 快,但别在热路径里无脑用
对中等大小对象(~10KB),structuredClone 通常比 JSON.parse(JSON.stringify()) 快 2–3 倍,因为它跳过了字符串序列化/解析开销,直接操作内存结构。
但它仍有代价:
- 拷贝
ArrayBuffer会分配新内存并复制字节,大文件(如视频帧数据)慎用 - 遇到深层嵌套或大量
Map/Set时,V8 的克隆逻辑仍可能触发 GC 压力 - 没有提供中间拦截(不像
structuredClone的transfer选项只适用于ArrayBuffer类型)
如果只是想深拷贝纯数据对象且要兼容老环境,JSON 方案反而更稳;真需要保留类型又确定运行环境,structuredClone 才值得上。
真正容易被忽略的是:它不处理原型链继承——返回对象的 constructor 是 Object,原始对象如果是 class A {} 实例,拷贝后就只是普通对象。这点连文档都很少强调。











