structuredclone能正确克隆含arraybuffer的对象:默认深拷贝创建独立缓冲区副本,typedarray视图连同底层buffer一并克隆且偏移长度不变;transfer选项可移交所有权实现零拷贝,但仅接受arraybuffer实例。

可以,structuredClone 能正确克隆包含 ArrayBuffer 的对象,且会深拷贝缓冲区本身(即创建新的 ArrayBuffer 实例),而不是共享引用。
支持 ArrayBuffer 及其视图
structuredClone 原生支持 ArrayBuffer、TypedArray(如 Uint8Array、Float32Array)、DataView 和 SharedArrayBuffer(需注意跨线程限制)。克隆后,新对象拥有独立的内存副本。
- 原始
ArrayBuffer的字节内容会被完整复制,新缓冲区与原缓冲区互不影响 -
TypedArray视图会连同其底层ArrayBuffer一起克隆,视图偏移和长度保持不变 - 多个视图指向同一
ArrayBuffer时,克隆结果中它们仍指向同一个新缓冲区(关系保留)
使用示例
以下代码演示了含 ArrayBuffer 对象的安全克隆:
const original = {
id: 'data-1',
buffer: new ArrayBuffer(8),
view: new Uint32Array(new ArrayBuffer(4)),
nested: { arr: new Float64Array([1.1, 2.2]) }
};
const cloned = structuredClone(original);
// 验证独立性
cloned.buffer.byteLength === 8; // true
cloned.view.length === 1; // true
cloned.nested.arr[0] = 999; // 不影响 original.nested.arr
// 缓冲区地址不同(无法直接比较,但修改互不影响)
const u8a = new Uint8Array(original.buffer);
const u8b = new Uint8Array(cloned.buffer);
u8a[0] = 1;
console.log(u8b[0]); // 0 —— 确认已深拷贝
注意事项与限制
尽管支持良好,但仍需留意几个边界情况:
- 不克隆
Function、undefined、Symbol、Promise、RegExp、Date(Date实际上是支持的,但需确认运行环境版本)等非可传输类型;含这些属性的对象会抛出DataCloneError -
SharedArrayBuffer可被克隆,但仅限同一线程内;跨 Worker 传递时需配合postMessage的transfer选项 - Node.js 从 v17.0+ 支持
structuredClone,v18.13+ 默认启用;浏览器方面 Chrome 98+、Firefox 99+、Safari 15.4+ 已支持 - 若目标环境不支持,可用
postMessage+message事件模拟(需在主线程或 Worker 中),但更推荐降级为JSON.parse(JSON.stringify(...))(仅适用于纯 JSON 数据,不适用ArrayBuffer)
替代方案参考(不推荐用于 ArrayBuffer)
避免对含 ArrayBuffer 的对象使用以下方法:
-
Object.assign或展开运算符:只做浅拷贝,ArrayBuffer引用被共享 -
JSON.stringify/parse:ArrayBuffer会被忽略或转为空对象 - 第三方深克隆库(如
lodash.cloneDeep):多数不处理ArrayBuffer,结果不可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











