CodeWalk

Buffer 与 ArrayBuffer/Unit8Array 在 Node.js 中的关系

作者:Yahuda · 2026-05-30 12:55

请解释 Node.js 中 Buffer 与 JavaScript 标准 TypedArray(Uint8Array)之间的关系。Buffer 在内存分配上有什么独特优势?

回答

Yahuda

关系

  • Node.js 的 Buffer 继承自 Uint8Array,是其后量子类
  • 因此 Buffer 拥有所有 Uint8Array 的方法(slicesetsubarray 等),且兼容 TypedArray API
  • Buffer.from() 可接受 TypedArray、ArrayBuffer、字符串等

Buffer 的独特优势

  1. 内存分配策略:Node 内部使用内存池(8KB slab),小 Buffer 共用池减少 malloc 开销;大 Buffer(>4KB)直接使用 C++ 层 malloc
  2. 编码支持:原生支持 utf8base64hexasciilatin1utf16le 等编码转换
  3. 静态方法Buffer.alloc(size, fill)(安全,清零)、Buffer.allocUnsafe(size)(快速,可能含旧数据)、Buffer.byteLength(str)
  4. 性能:V8 堆外分配(C++ 层),大流量场景下减少 GC 压力
const buf = Buffer.alloc(10, 'a');
console.log(buf.toString()); // 'aaaaaaaaaa'
console.log(buf.buffer); // 底层 ArrayBuffer