JS 中 TypedArray 的缓冲区

15 阅读2分钟

一、先用一句话解释(直觉版)

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 家族一览(常见)

类型每项字节数说明
Int8Array1有符号 8 位整数
Uint8Array1无符号 8 位
Uint8ClampedArray1用于 Canvas
Int16Array2有符号 16 位
Uint16Array2无符号 16 位
Int32Array4有符号 32 位
Uint32Array4无符号 32 位
Float32Array432 位浮点
Float64Array864 位浮点

四、一个完整例子(直观理解)

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 的本质区别(非常重要)

对比点ArrayTypedArray
内存是否连续❌ 不保证✅ 连续
元素类型任意固定
性能一般很高
可否存对象
用途业务数据二进制 / 性能

📌 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 世界里最接近“底层内存操作”的东西