structuredClone() 可安全复制 ArrayBuffer 并支持 transfer 零拷贝迁移:基础复制生成独立 buffer,transfer 后原 buffer 被分离,TypedArray 类型与数据均正确保留,但 transfer 仅接受 ArrayBuffer、不支持函数/undefined。

直接用 structuredClone() 就行——它原生支持 ArrayBuffer,且能保证内存隔离、类型保留、零额外转换。
基础复制:安全、完整、开箱即用
对普通 ArrayBuffer,只需一行:
const clonedBuffer = structuredClone(originalBuffer);- 结果是一个全新的
ArrayBuffer,clonedBuffer !== originalBuffer - 内容完全一致:
new Uint8Array(clonedBuffer).every((v, i) => v === new Uint8Array(originalBuffer)[i])返回true - 原始 buffer 不受影响,仍可读写
高性能转移:用 transfer 实现零拷贝迁移
当处理大体积二进制数据(如视频帧、音频缓冲区)时,复制内存代价高。此时应使用 transfer 选项将所有权移交:
- 只接受
ArrayBuffer实例(不能传Uint8Array.buffer后再改名,必须是原始 buffer 引用) - 语法:
structuredClone({ data: new Uint8Array(originalBuffer) }, { transfer: [originalBuffer] }) - 执行后:
originalBuffer.byteLength变为0(detached),不可再访问 - 新对象中
data.buffer指向同一块物理内存,但归属已切换——真正 O(1) 转移
配合 TypedArray 使用:保持类型语义不丢失
ArrayBuffer 通常和 TypedArray 配合使用。structuredClone 能连带正确克隆整个视图结构:
const view = new Float32Array(buffer, 0, 1000);const cloned = structuredClone({ view });-
cloned.view instanceof Float32Array为true -
cloned.view.buffer是独立 buffer,值与原 view 完全一致 - 若需转移,仍须显式传入
buffer到transfer列表,而非view.buffer的别名
常见误区提醒
几个高频出错点务必注意:
- 误传
TypedArray自身到transfer:会报错,transfer 只认ArrayBuffer - 期望 clone 后共享 buffer:默认行为是复制,不是共享;要共享需手动复用 buffer,而非依赖 clone
- 在不支持环境(如旧版 Safari 或 IE)中未降级:建议先检测
typeof structuredClone === 'function',再执行 - 混入函数或
undefined字段:哪怕对象里只有一个onload() {},也会立即抛DataCloneError

















