structuredclone()是现代javascript深拷贝首选方案,支持对象、数组、map、set、date、regexp、arraybuffer等类型并保留类型语义,不支持函数、symbol、dom节点等;需预检兼容性并按需降级,善用transfer优化二进制数据传递。

直接用 structuredClone() 就行,一行代码替代 JSON.parse(JSON.stringify()),彻底绕开它丢类型、崩循环、抹函数的老问题。
为什么 structuredClone 能突破 JSON 的局限
JSON 序列化本质是“文本中转”:对象 → 字符串 → 对象。这个过程强制把所有内容映射成 JSON 支持的有限类型(string/number/boolean/null/array/object),所以:
- Date 变成字符串,
new Date()失去时间计算能力 - Map / Set 变成空对象
{},键值对全丢失 - RegExp 变成
{},正则逻辑失效 - NaN、Infinity、BigInt 直接变成
null或报错 - 遇到循环引用立刻抛
TypeError: Converting circular structure to JSON
structuredClone 不走序列化路线,它调用的是浏览器底层的 结构化克隆算法(Structured Clone Algorithm),和 postMessage、Web Worker 数据传输用的是同一套机制——直接在内存层面复制可克隆的数据结构,保留类型语义和引用关系。
structuredClone 支持哪些类型(真正可用的)
它能安全深拷贝以下类型,且保持实例类型和行为不变:
- 普通对象、数组、嵌套结构
-
Date(cloned instanceof Date === true) -
RegExp(标志、源字符串、全局性都完整保留) -
Map和Set(键值对、迭代顺序、重复项处理均一致) -
ArrayBuffer、TypedArray(如Uint8Array)、BigInt64Array等二进制数据 -
BigInt、NaN、Infinity - 含循环引用的对象(自动识别并重建引用链)
structuredClone 不支持什么(必须避开的雷区)
它不是万能的,以下类型会直接报错或被忽略:
-
Function:调用时抛DATA_CLONE_ERR异常 -
Symbol属性:整个属性被跳过(不报错,但消失) - 原型链和类方法:克隆后是普通对象,
instanceof MyClass为false - DOM 节点(
Element、Document等):不支持 -
Proxy、WeakMap、WeakSet:无法克隆 -
Error对象、Window、FileList等宿主对象
如果你的数据里混有这些,得先剥离或转换——比如 Vue 的 ref/reactive 对象,要先用 toRaw() 转成普通对象再克隆。
实战写法与小技巧
基础用法就是一行:
const copy = structuredClone(original);
进阶用法加 transfer 选项,适合大体积二进制数据(如视频帧、音频缓冲):
- 普通克隆:
structuredClone(buffer)→ 复制全部内存(耗时、占双份) - 零拷贝转移:
structuredClone(buffer, { transfer: [buffer] })→ 原 buffer 自动清空,新对象独占内存,O(1)时间
注意:transfer 只对 ArrayBuffer 及其视图有效,传错类型会静默忽略。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











