structuredclone() 是浏览器和 node.js 原生支持的高性能深拷贝方法,支持 date、map、set、arraybuffer 等 json 无法处理的类型,自动处理循环引用;不支持函数、promise、dom 节点等,需注意兼容性与降级方案。

直接用 structuredClone() 就行,一行代码完成真正意义上的高性能深拷贝——它不转字符串、不依赖库、不手动递归,是浏览器和 Node.js 原生实现的结构化克隆算法,性能远超 JSON.parse(JSON.stringify()) 和手写递归。
它能拷什么?覆盖绝大多数现代数据结构
structuredClone() 天然支持 JS 中大量“JSON 无法处理”的类型,且保持原始类型实例:
- 基础类型:string、number、boolean、null、undefined、BigInt、可序列化的 Symbol(如
Symbol.for('id')) - 引用类型:普通对象、数组、
Date、RegExp、Error、Map、Set - 二进制与文件类:ArrayBuffer、TypedArray(如
Uint8Array)、Blob、File、ImageData(部分环境) - 特殊结构:循环引用自动识别并重建,避免栈溢出;嵌套无限深也没问题
它不能拷什么?提前知道边界才不踩坑
不是所有值都能被结构化克隆,明确限制可避免运行时报错或静默失败:
- 函数(
Function)、Promise、Proxy—— 克隆时直接抛错 -
WeakMap/WeakSet—— 不可枚举 + 弱引用,无法安全复制 - DOM 节点(
Element、Document、window)—— 不在结构化克隆白名单内 -
undefined、不可枚举属性、getter/setter 属性(只拷值,不执行逻辑,也不保留访问器) - 自定义类实例的原型方法和构造器信息 —— 克隆后是普通对象,
instanceof判定失效
怎么用最稳?基础写法 + 关键技巧
90% 场景只需最简调用,但几个细节决定是否真正“高性能”和“安全”:
- 基础拷贝:
const clone = structuredClone(original);—— 修改clone不会影响original,验证可用clone.date instanceof Date等 - 大二进制数据优化:用
transfer选项“移动”内存而非复制,适合 ArrayBuffer 传输场景const clone = structuredClone({ data: buf }, { transfer: [buf] });—— 执行后buf变为 detached,原对象不可再读 - 含
Blob/File的表单对象:确保它们是原生实例(如直接取自input.files[0]),元数据建议分离存储(如{ file, metadata: { id, tag } }),避免挂载在 Blob 上导致丢失 - object URL 需重生成:克隆后的
Blob内容有效,但已有的URL.createObjectURL()结果不继承,需对新实例重新调用
兼容性与降级方案:现代优先,旧环境有备无患
截至 2026 年中,主流环境已全面覆盖:
- 浏览器:Chrome 98+、Firefox 94+、Safari 15.4+、Edge 98+
- Node.js:18.12+ 默认启用;17.0+ 需加
--experimental-structured-cloning
不支持时,别 fallback 到 JSON.stringify(会丢 Date、Map 等)。推荐轻量降级:
- 对
Blob:用new Blob([blob], {type: blob.type}) - 对
File:用new File([blob], file.name, { type: file.type, lastModified: file.lastModified }) - 或引入 Polyfill,如
@ungap/structured-clone(注意:不支持transfer)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











