structuredclone()是处理typedarray深拷贝的最可靠方案,能保持类型、内容、长度及buffer独立性;但不支持函数、undefined、symbol等,且不自动transfer,json方式则会导致数据彻底丢失。

处理 TypedArray 的深拷贝,关键在于避免用错方法导致类型丢失、精度错乱或内存共享。structuredClone() 是当前最直接可靠的方案,但需清楚它能做什么、不能做什么。
为什么 TypedArray 不能用 JSON 方式拷贝
JSON.stringify() 遇到 Uint8Array、Float32Array 等会直接转成空对象 {} 或完全忽略,数据彻底丢失。例如:
-
JSON.stringify(new Uint8Array([1, 2, 3]))→"{}" - 还原后得到的是普通对象,不再是 TypedArray,
instanceof Uint8Array为 false - 长度、字节序、视图偏移等元信息全部消失
structuredClone() 的正确用法与注意事项
它原生支持所有标准 TypedArray(Uint8Array、Int32Array、Float64Array 等),并保持类型、内容、长度和底层 buffer 独立性:
- 拷贝后
cloned instanceof original.constructor为 true -
cloned.buffer !== original.buffer,修改互不影响 - 不自动 transfer:buffer 始终复制,不是移动;如需零拷贝迁移,仍要配合
postMessage(..., [buffer]) - 传入
{ transfer: [original.buffer] }可触发转移,但仅接受 ArrayBuffer,不能传 TypedArray 实例本身
兼容老环境时的手动 fallback 方案
若需支持 Chrome 98 之前、Safari 15.4 之前或 Node.js 旧版本,可按类型显式构造:
- 判断类型:
ArrayBuffer.isView(obj)或obj.buffer instanceof ArrayBuffer - 安全重建:
new obj.constructor(obj)或obj.constructor.from(obj) - 注意边界:对 DataView 需额外传入
obj.buffer, obj.byteOffset, obj.byteLength - 避免用
Array.from()直接转换——它返回普通数组,丢失 TypedArray 特性
哪些值会悄悄破坏拷贝流程
即使对象主体含 TypedArray,混入以下任一值都会让 structuredClone() 报 DataCloneError:
- 函数(哪怕只是配置里的一个回调字段)
-
undefined或原始Symbol(Symbol.for()可克隆) -
Error实例(stack、cause 等不可克隆属性会丢失)
建议业务中提前清洗或包裹 try/catch 降级处理。










