Buffer 与 ArrayBuffer/Unit8Array 在 Node.js 中的关系
请解释 Node.js 中 Buffer 与 JavaScript 标准 TypedArray(Uint8Array)之间的关系。Buffer 在内存分配上有什么独特优势?
回答
Yahuda
关系:
- Node.js 的
Buffer继承自Uint8Array,是其后量子类 - 因此 Buffer 拥有所有 Uint8Array 的方法(
slice、set、subarray等),且兼容 TypedArray API Buffer.from()可接受 TypedArray、ArrayBuffer、字符串等
Buffer 的独特优势:
- 内存分配策略:Node 内部使用内存池(8KB slab),小 Buffer 共用池减少 malloc 开销;大 Buffer(>4KB)直接使用 C++ 层
malloc - 编码支持:原生支持
utf8、base64、hex、ascii、latin1、utf16le等编码转换 - 静态方法:
Buffer.alloc(size, fill)(安全,清零)、Buffer.allocUnsafe(size)(快速,可能含旧数据)、Buffer.byteLength(str) - 性能:V8 堆外分配(C++ 层),大流量场景下减少 GC 压力
const buf = Buffer.alloc(10, 'a');
console.log(buf.toString()); // 'aaaaaaaaaa'
console.log(buf.buffer); // 底层 ArrayBuffer