structuredClone 是现代 JavaScript 原生深拷贝方法,支持 Map、Set、Date 等类型,但不支持函数、循环引用和原型链;Chrome 98+、Firefox 94+、Safari 15.4+ 及 Node.js 18.13+ 默认支持。

structuredClone 是现代 JavaScript 中原生支持的深拷贝方法,比手写递归或依赖第三方库更安全、简洁、且能正确处理很多边界情况(如 Map、Set、Date、RegExp、ArrayBuffer、Blob、Error 等)。它从 Chrome 98、Firefox 94、Safari 15.4 起已广泛支持(Node.js 17.0+ 也支持,需启用 --harmony-structured-clone 标志,Node.js 18.13+ 默认启用)。
什么时候可以直接用 structuredClone 替代递归深拷贝
如果你的源数据是纯可序列化对象(即符合 structured clone algorithm 支持的类型),比如:
- 普通对象、数组、基本类型(string/number/boolean/null/undefined/Symbol)
- Date、RegExp、Map、Set、TypedArray、DataView、ArrayBuffer
- 嵌套结构(包括循环引用?❌ 不支持!见下文)
那么只需一行:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
structuredClone 的关键限制和注意事项
它不是“万能替代”,使用前需确认是否踩中以下限制:
立即学习“Java免费学习笔记(深入)”;
-
不支持函数、Promise、WeakMap、WeakSet、DOM 节点、window 对象等不可序列化值——遇到会直接抛错:
DataCloneError -
不支持循环引用——与 JSON.stringify 类似,会报错
DataCloneError: cyclic object value -
不保留原型链——克隆后对象的
constructor和__proto__都会被重置为默认(如普通对象变成Object实例) -
某些特殊对象行为可能变化:例如
Error实例会被克隆为普通对象(丢失 stack 属性),RegExp的lastIndex会被重置为 0
如何平滑过渡:兼容 fallback 方案
若项目需兼容旧环境,或数据可能含函数/循环引用,建议封装一个带降级的工具函数:
function safeClone(obj) {try {
return structuredClone(obj);
} catch (e) {
// 仅当明确知道数据结构简单时,才退到 JSON 方案
if (e.name === 'DataCloneError' && !hasFunctionOrCircular(obj)) {
return JSON.parse(JSON.stringify(obj));
}
// 否则建议显式报错或使用成熟库(如 lodash.cloneDeep)
throw new Error('Cannot clone this value: ' + e.message);
}
}
对比传统递归深拷贝的典型优势
- 性能更好:底层 C++ 实现,尤其对大型 ArrayBuffer 或嵌套结构更快
- 语义更准:自动处理 Map/Set 的键值对、TypedArray 的字节序、RegExp 的标志位等
-
代码更少更可靠:无需自己处理
instanceof分支、循环引用检测、不可枚举属性等易错逻辑 - 未来更可持续:是标准 API,浏览器持续优化,无需维护自定义逻辑

















