TypedArray 视图是同一 ArrayBuffer 上的不同解释层,不复制数据而仅改变读取方式;多个视图共享缓冲区,按各自类型规则即时映射字节,支持偏移切片与 DataView 协同解析混合格式。

TypedArray 视图的本质,是同一块内存(ArrayBuffer)上叠加的不同“解释层”——它不搬数据,只换眼镜。
视图共享同一段 ArrayBuffer
ArrayBuffer 是纯粹的字节容器,本身不可读写。TypedArray 不是独立数组,而是绑定到这个缓冲区上的“类型化镜头”。多个视图可以同时指向同一个 buffer,各自按自己的规则解读字节序列。
- 例如:const buf = new ArrayBuffer(8); 分配 8 字节原始内存
- const u8 = new Uint8Array(buf); 把这 8 字节看作 8 个独立的 0–255 整数
- const i32 = new Int32Array(buf); 把前 4 字节看作一个带符号 32 位整数,后 4 字节看作另一个
- 修改 u8[0] = 1,i32[0] 的值立刻变为 1(小端序下);改 i32[0] = 0x01020304,u8[0]–u8[3] 就变成 [4, 3, 2, 1]
不同视图 = 不同数据结构语义
同一段内存,因视图类型不同,获得完全不同的逻辑含义。这不是转换,是即时重映射。
- Uint8Array:适合逐字节操作,如协议头解析、像素灰度值处理
- Float32Array:适合数学运算,如音频采样点滤波、向量计算
- Uint8ClampedArray:适合 Canvas 图像数据,溢出自动截断(256→255),避免越界失真
- Int16Array:适合 WAV 音频帧,每个元素代表一个有符号 16 位样本
偏移与长度控制实现零拷贝切片
视图可指定起始偏移和元素数量,直接“框选”缓冲区局部区域,无需复制字节。
- new Uint8Array(buf, 4):跳过前 4 字节,从第 5 字节开始读取剩余全部
- new Int32Array(buf, 8, 2):从第 9 字节起(偏移 8),取 2 个 int32 元素(占 8 字节)
- WebSocket 收到二进制包后,用 new DataView(buf) 解析前 2 字节为包长,再用 new Uint8Array(buf, 6) 直接访问载荷,全程无内存分配
与 DataView 协作处理混合格式
当数据结构不规整(如字段长度不齐、字节序需显式控制),TypedArray 负责批量同构数据,DataView 负责精确定位与跨平台解析。
- 协议示例:[2 字节 length][1 字节 flag][4 字节 timestamp][N 字节 payload]
- 用 view.getUint16(0, true) 读长度(小端),view.getUint8(2) 读 flag
- 再用 new Uint8Array(buf, 7, length) 获取 payload 视图,交给图像解码或加密函数直接处理










