无需登录 数据私有 本地保存

structuredClone 可转移对象演示 - 高性能深拷贝

8
0
0
0

🚀 structuredClone 可转移对象演示

高性能深拷贝 · Transfer 所有权转移 · ArrayBuffer 零拷贝演示

Chrome 98+ Firefox 94+ Safari 15.4+
测试数据配置
转移模式:ArrayBuffer 所有权从原对象转移到克隆对象,原 buffer 将被置为失效(byteLength = 0),实现零拷贝高性能。
原始对象 Buffer 活跃
ArrayBuffer 状态 1 MB
对象预览
点击「生成测试数据」开始
克隆对象(复制模式) Buffer 独立副本
ArrayBuffer 状态
耗时
对象预览
等待克隆操作
克隆对象(转移模式) Buffer 已转移
ArrayBuffer 状态
耗时
对象预览
等待克隆操作
常见问题 & 知识点
🔍 什么是 structuredClone?
structuredClone() 是浏览器内置的深拷贝 API,能够克隆大多数结构化数据,包括 ArrayBuffer、Date、Map、Set、RegExp、循环引用JSON.stringify 无法处理的数据类型。它基于 HTML 结构化克隆算法,比 JSON 深拷贝更强大、更可靠。
⚡ Transfer(转移)选项是什么?
structuredClone(obj, { transfer: [buffer] }) 中的 transfer 选项允许将 可转移对象(如 ArrayBuffer、MessagePort、ImageBitmap)的所有权从原对象转移到克隆对象,而不是复制。转移后,原 buffer 的 byteLength 变为 0(被 neutered),实现零内存复制,极大提升大块二进制数据的克隆性能。
📋 哪些对象可以被转移(Transferable Objects)?
可转移对象包括:ArrayBuffer、MessagePort、ImageBitmap、OffscreenCanvas、ReadableStream、WritableStream、TransformStream、VideoFrame、AudioData 等。最常用的是 ArrayBuffer,在 Web Worker 通信、大文件处理、WebGL 纹理传输等场景中非常实用。
🆚 structuredClone vs JSON 深拷贝有什么区别?
特性structuredCloneJSON 深拷贝
ArrayBuffer✅ 支持(可转移)❌ 丢失数据
Date / Map / Set✅ 完美支持❌ Date 变字符串
循环引用✅ 自动处理❌ 抛出错误
函数 / DOM 节点❌ 抛出错误❌ 忽略/报错
大 Buffer 性能⚡ 极快(transfer)❌ 无法处理
⚠️ 使用 transfer 后原对象会怎样?
转移后,原 ArrayBuffer 会被 neutered(去势),其 byteLength 变为 0,任何尝试读写该 buffer 的操作都会静默失败或返回 0。这是设计行为,确保同一时刻只有一份内存 ownership,避免数据竞争。在上方演示中,转移后原始对象的 buffer 状态会变为红色失效状态。
🎯 什么场景适合使用 structuredClone + transfer?
典型场景包括:Web Worker 数据传输(主线程与 Worker 间传递大块数据)、大文件分片处理(避免内存翻倍)、WebGL 纹理上传音视频帧处理(VideoFrame 转移)、实时数据流管道等。任何涉及大块二进制数据且只需保留一份的场景都适合使用 transfer。
🧪 如何检测一个对象是否可转移?
可以使用 ArrayBuffer.prototype.transfer 方法(Chrome 114+)或检查对象是否为可转移类型。简单判断:obj instanceof ArrayBuffer || obj instanceof MessagePort || obj instanceof ImageBitmap。在实际使用中,只需将需要转移的对象引用放入 transfer 数组即可,引擎会自动处理。