structuredclone 是 javascript 原生深拷贝 api,一行调用即可安全复制对象、数组、map、set、date、regexp 等类型,支持循环引用,不丢失类型语义,且不依赖序列化;不支持函数、symbol、dom 节点等不可克隆值,遇错抛 datacloneerror。

JavaScript 中 structuredClone 是浏览器原生提供的深拷贝方法,能安全、高效地复制支持的值类型,避免了手动递归或第三方库的复杂性与潜在风险。
structuredClone 的基本用法
它是一个全局函数,接受一个参数(需为可结构化克隆的对象),返回其深拷贝:
- 支持对象、数组、Map、Set、Date、RegExp、ArrayBuffer、TypedArray、DataView、Blob、File、ImageBitmap、ImageData、DOM 节点(部分环境)等
- 不支持函数、undefined、Symbol、BigInt(目前多数浏览器仍不支持,会抛错)、window、document 等不可序列化值
- 调用方式简单:
const copy = structuredClone(original)
和 JSON.parse(JSON.stringify()) 的关键区别
structuredClone 不依赖字符串序列化,因此能保留更多原始语义:
- 保持 Map/Set 的键值对顺序和类型(JSON 会丢失)
- 正确处理 Date、RegExp、正则标志(g/i/m)、TypedArray 视图(如 Uint8Array)
- 支持循环引用(
JSON.stringify直接报错) - 不会把 undefined、function、Symbol 意外转成 null 或丢弃(而是直接抛错,更明确)
使用注意事项和兼容性处理
目前(2024 年中)主流现代浏览器已支持,但旧版 Safari 和部分 Node.js 版本尚未内置:
- Chrome 98+、Firefox 94+、Edge 98+、Safari 15.4+ 支持
- Node.js 17.0+ 实验性启用,18.13+ 默认开启(需确认
--enable-structured-clone是否仍需) - 若需兼容旧环境,可加简单检测和降级逻辑:
function safeClone(obj) {
if (typeof structuredClone === 'function') {
try {
return structuredClone(obj);
} catch (e) {
throw new Error('structuredClone failed: ' + e.message);
}
}
throw new Error('structuredClone not supported in this environment');
}
不能拷贝的常见情况及替代思路
遇到不支持类型时,structuredClone 会立即抛出 DataCloneError,而非静默失败:
- 函数:需手动提取逻辑,或改用 class/配置对象封装行为
- Symbol / BigInt:若必须保留,考虑用自定义序列化(如存 Symbol 描述符 + 运行时重建)
- DOM 元素:跨文档拷贝受限,通常应避免深拷贝整个 DOM 树;如需副本,用
cloneNode(true) - 自定义类实例:仅拷贝其可枚举属性(类似普通对象),原型方法和私有字段(#field)不会被复制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











