structuredclone() 是 js 原生深拷贝方法,支持 map、set、date、regexp、arraybuffer 等,但不支持函数、symbol、循环引用和 class 方法;需检查兼容性并捕获异常。

JS 中可以用 structuredClone() 全局方法实现原生、安全、高效的深拷贝,无需第三方库,且天然支持 Map、Set、Date、RegExp、ArrayBuffer 等复杂类型。
✅ 支持的类型和基本用法
structuredClone() 是浏览器和 Node.js(v17.0+ 默认启用,v18.13+/v20.0+ 稳定)原生提供的方法,语法极简:
const cloned = structuredClone(original);
它能正确处理:
- 普通对象与嵌套对象
- 数组(含稀疏数组)
- Map 和 Set
- Date、RegExp、Error(部分环境)、ArrayBuffer、TypedArray、DataView、Blob、File(在支持上下文中)
- 包含循环引用的对象?❌ 不支持 —— 会抛出
DataCloneError
⚠️ 注意事项和常见限制
这个方法不是“万能深拷贝”,使用前需留意:
-
不支持函数、undefined、Symbol、Promise、window 对象、DOM 节点:遇到这些值会直接报错(
DataCloneError) -
不支持循环引用:比如
obj.a = obj;,调用时会抛异常 - 不能拷贝私有字段(#field)或 class 实例的方法:只拷贝可枚举的自有属性,且目标是 plain object 或对应内置类型实例
-
某些环境需显式启用:Node.js v17 需加
--enable-structured-cloning标志;v18.13+ 默认开启
? 替代方案对比(何时不用它)
如果你的数据含以下内容,structuredClone 会失败,需换方案:
- 带方法的对象 → 可考虑
JSON.parse(JSON.stringify(obj))(仅限纯数据,丢失 Date/RegExp 等) - 需要保留 class 构造信息 → 用自定义克隆逻辑或
lodash.cloneDeep - 存在循环引用 → 使用支持循环检测的库(如 lodash、immer)或手动实现 map 缓存
- 需兼容旧浏览器(如 IE、Safari
? 兼容性检查与安全调用
生产中建议先检测是否存在再使用:
if (typeof structuredClone === 'function') {
try {
const copy = structuredClone(data);
// ✅ 安全使用
} catch (err) {
console.warn('structuredClone 失败,回退到其他方式', err);
// 回退逻辑,例如 JSON 方案或报错提示
}
} else {
// 降级处理
}
也可以封装一个健壮的克隆函数:
function safeClone(obj) {
if (typeof structuredClone === 'function') {
try {
return structuredClone(obj);
} catch {
throw new Error('无法克隆该数据:可能含函数、循环引用或不支持的类型');
}
}
throw new Error('当前环境不支持 structuredClone');
}
不复杂但容易忽略:它快、标准、轻量,但只适用于“可结构化”的数据。用对场景,就是最干净的深拷贝答案。











