JavaScript中处理二进制数据主要依靠ArrayBuffer和TypedArray;ArrayBuffer是不可变内存块,TypedArray是其类型化视图,支持高效读写,常用于图片、音频、WebSocket等场景。

JavaScript 中处理二进制数据主要靠 ArrayBuffer 和基于它的 TypedArray(如 Uint8Array、Int32Array 等),它们不是普通数组,而是直接操作内存块的视图,适合高效读写二进制内容(比如图片解析、音频处理、WebSocket 二进制消息、文件上传下载等)。
理解 ArrayBuffer 和 TypedArray 的关系
ArrayBuffer 是一块**原始的、不可变的内存区域**,它本身不提供读写能力;TypedArray(如 Uint8Array、Float64Array)是它的**视图(view)**,定义了如何按特定类型和偏移去解释这块内存。
- 一个
ArrayBuffer可以有多个不同类型的视图,互不干扰(只要不越界) - 修改某个
TypedArray的值,会直接反映在底层ArrayBuffer上 - 不能直接对
ArrayBuffer调用.push()或.length—— 它没有这些方法
常用 TypedArray 创建与基本操作
大多数场景从 TypedArray 入手更方便,它会自动分配或关联 ArrayBuffer:
-
创建新缓冲区:
const uint8 = new Uint8Array(1024);→ 分配 1024 字节的ArrayBuffer -
基于已有 buffer 创建视图:
const buf = new ArrayBuffer(16); const int32 = new Int32Array(buf);(16 字节可存 4 个 32 位整数) -
读写数据:
uint8[0] = 255;、int32[1] = -123;,支持索引访问和遍历 -
获取底层 buffer:
uint8.buffer返回对应的ArrayBuffer
ArrayBuffer 与普通数组、字符串互转
实际开发中常需在二进制与 JS 常见类型间转换:
立即学习“Java免费学习笔记(深入)”;
-
Uint8Array ↔ 字符串(UTF-8):
new TextDecoder().decode(uint8)(解码)new TextEncoder().encode("hello")(编码,返回Uint8Array) -
ArrayBuffer ↔ Blob:
new Blob([buf])或blob.arrayBuffer()(返回 Promise) -
ArrayBuffer ↔ Base64:
编码:btoa(String.fromCharCode(...new Uint8Array(buf)))(小数据可用)
解码:Uint8Array.from(atob(str), c => c.charCodeAt(0))
注意内存安全与兼容性细节
使用时容易踩坑的地方:
-
视图越界不会报错,但结果未定义:确保索引在
view.length范围内,或用view.byteLength校验总字节数 -
不同 TypedArray 对同一 buffer 的字节序共享:比如
new Uint32Array(buf)[0]和new Uint8Array(buf).subarray(0,4)指向相同字节,修改任一都会影响另一 -
ArrayBuffer 无法被 JSON 序列化:需先转成
Uint8Array再用Array.from()得到普通数组,或用.buffer.slice()复制后转 Base64 -
部分老浏览器不支持
TextEncoder/TextDecoder:可用 polyfill 补齐


















