structuredClone 能保留 TypedArray 类型,因其基于结构化克隆算法,原生支持 ArrayBuffer 及所有 TypedArray 子类的精确深拷贝,包括类型、值和独立 buffer,而 JSON 方法会丢失类型和数据。

structuredClone 在处理 TypedArray(如 Uint8Array、Float32Array 等)时,**默认就会保持原始类型**,无需额外操作。这是它的设计特性之一,也是它比 JSON.parse(JSON.stringify(...)) 更可靠的关键优势。
为什么 structuredClone 能保留 TypedArray 类型
因为 structuredClone 基于结构化克隆算法(Structured Clone Algorithm),原生支持多种内置对象的精确复制,包括:
-
ArrayBuffer和所有TypedArray子类(Int32Array、Uint8ClampedArray、DataView等) -
Map、Set、Date、RegExp、BigInt、Array、Object(普通键值对) - 嵌套结构中的这些类型也会被递归保留
实际验证:类型不丢失
你可以直接测试:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
const original = new Float64Array([1.5, 2.7, 3.9]); const cloned = structuredClone(original); console.log(cloned instanceof Float64Array); // true console.log(cloned.constructor === Float64Array); // true console.log(cloned.buffer !== original.buffer); // true(新 ArrayBuffer,真正深拷贝) console.log(cloned[0] === original[0]); // true(值一致)
注意事项和边界情况
虽然类型保留是默认行为,但需注意以下几点:
立即学习“Java免费学习笔记(深入)”;
-
不支持函数、undefined、Symbol、WeakMap、WeakSet、Error 对象、DOM 节点等 —— 这些会抛出
DataCloneError -
ArrayBuffer 若被多个 TypedArray 共享视图(shared buffer),
structuredClone会为每个视图创建独立副本,不共享底层内存(即不会复制“共享”语义,而是安全隔离) -
如果 TypedArray 是从 SharedArrayBuffer 创建的,则
structuredClone会失败(因为 SharedArrayBuffer 不可克隆),需手动处理或改用普通 ArrayBuffer
对比 JSON 方法:为什么不能用 JSON
JSON.stringify(new Uint8Array([1,2,3])) 得到的是空对象 {};JSON.stringify 完全忽略 TypedArray 内容,还原后变成空对象或数组,类型和数据全丢。而 structuredClone 没这个问题。

















