ArrayBuffer 是固定长度的原始二进制内存块,仅提供存储;TypedArray 是其类型化视图,用于按特定格式读写内存;DataView 则支持显式字节序控制,适用于协议解析等场景。

ArrayBuffer 是一段固定长度的原始二进制内存块,它本身不提供读写能力,只是为二进制数据提供底层存储空间;TypedArray(如 Uint8Array、Int32Array)则是基于 ArrayBuffer 的“视图”,用特定数据类型来解释和操作这块内存。
ArrayBuffer:二进制数据的容器
它是一块连续的、不可变长度的字节数组,创建后大小不能更改。例如 new ArrayBuffer(12) 分配了 12 字节的空内存。它的唯一可用属性是 byteLength,表示总字节数。你不能直接访问 buffer[0],也不能调用数组方法,因为它不是数组——只是内存引用。
TypedArray:带类型的访问接口
TypedArray 不是单一构造函数,而是一组构造器的统称,每种对应一种数据格式和内存粒度:
-
Uint8Array:每个元素占 1 字节,适合逐字节操作(如解析协议头) -
Int16Array:每个元素占 2 字节,按有符号 16 位整数解读 -
Float32Array:每个元素占 4 字节,按 IEEE 754 单精度浮点数解读 - 同个 ArrayBuffer 可同时被多个 TypedArray 视图引用,比如用
Uint8Array看字节,又用Int32Array看整数——它们共享同一段内存,修改一个会影响另一个(注意字节序)
如何协同处理二进制数据
典型流程是:分配 ArrayBuffer → 创建 TypedArray 视图 → 读写数据。例如:
立即学习“Java免费学习笔记(深入)”;
const buf = new ArrayBuffer(8);
const u8 = new Uint8Array(buf);
u8[0] = 0xFF; u8[1] = 0x00;
const i32 = new Int32Array(buf);
console.log(i32[0]); // 值取决于前 4 字节和当前平台字节序
这种组合避免了普通 JS 数组的对象开销,所有操作直接映射到内存字节,适合高频、大批量场景(如音频帧处理、图像像素操作、WebSocket 二进制消息)。
何时用 DataView 而不是 TypedArray
当需要跨平台一致的字节序(比如解析网络包或 PNG 文件头),TypedArray 默认使用系统原生序(通常是小端),不够可控。这时改用 DataView,它允许显式指定 littleEndian 参数:
const view = new DataView(buf);
view.setUint32(0, 0x12345678, false); // 写入大端
const val = view.getUint32(0, true); // 从小端读取
它更适合协议解析、文件格式处理等对字节布局敏感的任务。











