structuredClone()是深拷贝TypedArray的首选方案,能独立复制ArrayBuffer并保留类型与数据;旧环境可用new ta.constructor(ta)或.set()实现;slice()可用但语义非深拷贝,Array.from()和展开语法会丢失类型。

TypedArray(如 Uint8Array、Float32Array 等)本身是类数组对象,底层共享 ArrayBuffer,**直接使用 JSON.parse(JSON.stringify()) 会失败(返回空对象),而 structuredClone() 是最推荐的原生深拷贝方式**。
用 structuredClone()(现代浏览器 & Node.js 17.0+)
这是目前最简洁、安全、语义正确的方案,能完整保留类型、长度、数据,并正确处理 ArrayBuffer 的独立复制:
- 自动克隆底层
ArrayBuffer,新 TypedArray 不与原对象共享内存 - 支持所有 TypedArray 类型(
Int16Array、BigUint64Array等) - 在支持环境中无需额外逻辑,一行解决
const original = new Uint8Array([1, 2, 3, 4]); const copy = structuredClone(original); copy[0] = 99; console.log(original[0]); // 1(未受影响) console.log(copy[0]); // 99
兼容旧环境:手动创建 + .set()
若需支持不支持 structuredClone() 的环境(如旧版 Node.js 或 IE/老 Safari),可基于构造函数和 .set() 实现等效深拷贝:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 先用
original.constructor获取对应类型构造器 - 传入
original.length创建新实例(分配新ArrayBuffer) - 用
.set(original)复制数据
function cloneTypedArray(ta) {
return new ta.constructor(ta);
}
// 或更显式写法:
const copy = new original.constructor(original.length);
copy.set(original);
注意:别用 slice()、Array.from() 或展开语法
这些方法看似方便,但存在关键问题:
-
ta.slice()→ 返回同类型新实例 ✅(可用,但语义上是“浅拷贝”内存,实际效果等同深拷贝,因底层 ArrayBuffer 已被复制) -
Array.from(ta)→ 返回普通Array,丢失类型和性能优势 ❌ -
[...ta]→ 同样返回普通数组,且无法还原为 TypedArray ❌ -
new ta.constructor(ta)→ ✅ 推荐,等价于slice()且更明确
进阶:只克隆视图,不复制底层 buffer(极少数场景)
如果明确需要共享同一块内存(例如做多视图映射),应复用原 ArrayBuffer:
- 用
new Int32Array(original.buffer, offset, length)创建新视图 - 这不是深拷贝,而是共享内存的“新解释”,修改会影响原数组
- 仅在需要零拷贝视图切换时使用,日常深拷贝场景不适用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










