一、先用一句话解释(直觉版)
TypedArray 类型的缓冲区 = 一块“连续的二进制内存”,用来按固定类型、高性能地读写数据。
不像普通数组是“装 JS 值的盒子”,
它更像 C 语言里的数组 / 内存块。
二、核心概念拆解(一定要分清这 3 个)
2.1️、 ArrayBuffer(真正的“缓冲区”)
const buffer = new ArrayBuffer(16)
- 只是一块内存
- 不能直接读写
- 单位是 字节(byte)
相当于:malloc(16)
2.2、 TypedArray(类型化视图)
const view = new Uint8Array(buffer)
-
指定 如何解释这块内存
-
决定:
- 每个元素占几个字节
- 是整数 / 浮点数
- 是否有符号
相当于:int[] / float[]
2.3、DataView(低级读写)
const dv = new DataView(buffer)
- 精确到 字节级别
- 可控制大小端(endianness)
- 常用于协议解析
三、TypedArray 家族一览(常见)
| 类型 | 每项字节数 | 说明 |
|---|---|---|
Int8Array | 1 | 有符号 8 位整数 |
Uint8Array | 1 | 无符号 8 位 |
Uint8ClampedArray | 1 | 用于 Canvas |
Int16Array | 2 | 有符号 16 位 |
Uint16Array | 2 | 无符号 16 位 |
Int32Array | 4 | 有符号 32 位 |
Uint32Array | 4 | 无符号 32 位 |
Float32Array | 4 | 32 位浮点 |
Float64Array | 8 | 64 位浮点 |
四、一个完整例子(直观理解)
const buffer = new ArrayBuffer(8)
// 用 32 位整数视图看它
const int32 = new Int32Array(buffer)
// 用 8 位整数视图看它
const uint8 = new Uint8Array(buffer)
int32[0] = 1
console.log(uint8)
// [1, 0, 0, 0, 0, 0, 0, 0]
发生了什么?
- 同一块内存
- 不同 TypedArray = 不同“看法”
- 数据没有复制
五、为什么叫「TypedArray 缓冲区」
因为在工程里经常这么说:
TypedArray 是 ArrayBuffer 的“类型化缓冲区视图”
也就是:
ArrayBuffer(内存)
↑
TypedArray(类型视图)
所以口语里就会说:
“这里用的是 TypedArray 类型的缓冲区”
六、和普通 Array 的本质区别(非常重要)
| 对比点 | Array | TypedArray |
|---|---|---|
| 内存是否连续 | ❌ 不保证 | ✅ 连续 |
| 元素类型 | 任意 | 固定 |
| 性能 | 一般 | 很高 |
| 可否存对象 | ✅ | ❌ |
| 用途 | 业务数据 | 二进制 / 性能 |
📌 TypedArray = 面向机器
📌 Array = 面向业务
七、常见使用场景(你很可能已经用过)
- WebGL / Three.js 顶点数据
- 音频 PCM 数据
- 图片像素处理(Canvas)
- 网络二进制协议
- 文件流(Blob / File)
- WASM 交互
八、TypeScript 中的类型关系
const u8: Uint8Array = new Uint8Array(10)
// TS 里它也是数组
u8[0] = 255
但注意:
u8.push(1) // ❌ 没有 push
因为它是 定长缓冲区视图
九、总结
TypedArray 类型的缓冲区,本质是:
「一块连续内存(ArrayBuffer) + 固定类型解释(TypedArray)」
是 JS 世界里最接近“底层内存操作”的东西