Skip to main content
Bun 实现了多种用于在 JavaScript 中处理二进制数据的数据类型和工具,其中大部分是 Web 标准。Bun 特有的 API 会特别注明。 此速查表兼作目录;单击左列中的类可跳转到其章节。

ArrayBuffer 和视图

JavaScript 直到 ECMAScript v5(2009)才引入处理二进制数据的机制。最基本的构建块是 ArrayBuffer,一个表示内存中字节序列的数据结构。
尽管名称如此,但它不是一个数组,也不支持你可能期望的任何数组方法和操作符。你无法直接从 ArrayBuffer 读取或写入值;你只能检查其大小和从中创建”切片”。
要读取或写入数据,你需要一个”视图”:一个_包装_ ArrayBuffer 实例的类,允许你读取和操作底层数据。有两种类型的视图:_类型化数组_和 DataView

DataView

DataView 类是一个较低级别的接口,用于读取和操作 ArrayBuffer 中的数据。 以下创建一个 DataView 并将第一个字节设置为 3。
接下来,在字节偏移量 1 处写入一个 Uint16。这需要两个字节。值 5132 * 256 + 1;在字节中,即 00000010 00000001
底层 ArrayBuffer 的前三个字节现在已有值。尽管第二和第三个字节是用 setUint16() 写入的,你仍然可以使用 getUint8() 读取每个组件字节。
写入的值需要的空间超过底层 ArrayBuffer 的大小时会抛出错误。以下在字节偏移量 0 处写入一个 Float64(需要 8 个字节),但缓冲区只有 4 个字节长。
以下方法在 DataView 上可用:

TypedArray

类型化数组是一系列类,提供类似 Array 的接口来与 ArrayBuffer 中的数据交互。DataView 允许你在特定偏移处写入不同大小的数字,而 TypedArray 将底层字节解释为固定大小的数字数组。
通常将这些类统称为它们的共享超类 TypedArray。这个类是 JavaScript _内部_的;你不能直接创建它的实例,而且 TypedArray 没有在全局作用域中定义。将其视为一个 interface 或抽象类。
类型化数组类,以及它们如何解释 ArrayBuffer 中的字节: 下表显示了不同类型化数组类如何解释 ArrayBuffer 中的相同字节。 从预定义的 ArrayBuffer 创建类型化数组:
从同一个 ArrayBuffer 实例化一个 Uint32Array 会抛出错误。
一个 Uint32 值需要四个字节(32 位)。因为 ArrayBuffer 是 10 个字节长,所以无法将其内容干净地分为 4 字节块。 要解决此问题,在 ArrayBuffer 的特定”切片”上创建类型化数组。以下 Uint32Array 只”视图”底层 ArrayBuffer 的_前_ 8 个字节:byteOffset0length2,即数组容纳的 Uint32 值的数量。
你不需要先创建一个 ArrayBuffer 实例;可以直接向类型化数组构造函数传递一个长度:
类型化数组也可以直接从数字数组或其他类型化数组实例化:
类型化数组提供与常规数组相同的方法,但有一些例外。例如,pushpop 不可用,因为它们需要调整底层 ArrayBuffer 的大小。
有关类型化数组属性和方法的更多信息,请参阅 MDN 文档

Uint8Array

Uint8Array 是 JavaScript 中最常见的类型化数组。它表示一个经典的”字节数组”:一个 0 到 255 之间的 8 位无符号整数序列。 在 Bun 中,它有在字节数组和 base64 或十六进制字符串表示之间进行转换的方法。
它是 TextEncoder#encode 的返回值,以及 TextDecoder#decode 的输入类型,这两个工具类用于在字符串和各种二进制编码之间进行转换,最著名的是 "utf-8"

Buffer

Bun 实现了 Buffer,一个用于处理二进制数据的 Node.js API,它早于 JavaScript 规范中类型化数组的引入。后来它被重新实现为 Uint8Array 的子类。它提供了广泛的方法,包括多种类似 ArrayDataView 的方法。
请参阅 Node.js 文档

Blob

Blob 是一个 Web API,常用于表示文件。它起源于浏览器(与 ArrayBuffer 不同,后者是 JavaScript 本身的一部分),但 Node.js 和 Bun 也支持它。 你很少直接创建 Blob 实例;它们通常来自外部源(如浏览器中的 <input type="file"> 元素)或库。不过,你可以从一个或多个字符串或二进制”blob 部分”创建一个 Blob
这些部分可以是 stringArrayBufferTypedArrayDataView 或其他 Blob 实例。各个部分按给定的顺序连接。
以多种格式异步读取 Blob 的内容。

BunFile

BunFileBlob 的子类,表示磁盘上一个惰性加载的文件。与 File 一样,它添加了 namelastModified 属性。与 File 不同的是,它不需要将文件加载到内存中。

File

FileBlob 的子类,添加了 namelastModified 属性。它在浏览器中常用于表示使用 <input type="file"> 元素上传的文件。Node.js 和 Bun 实现了 File
请参阅 MDN 文档

流允许你处理二进制数据,而无需一次性全部加载到内存中。它们通常用于读取和写入文件、发送和接收网络请求,以及处理大量数据。 Bun 实现了 Web API ReadableStreamWritableStream
Bun 也实现了 node:stream 模块,包括 ReadableWritableDuplex。完整的文档请参考 Node.js 文档。
要创建一个可读流:
使用 for await 逐块读取流。
有关 Bun 中流的更多信息,请参见

转换

使用本节作为将一种二进制格式转换为另一种的参考。

ArrayBuffer

由于 ArrayBuffer 存储的是支撑其他二进制结构(如 TypedArray)的数据,以下代码片段并不是从 ArrayBuffer _转换_到另一种格式。相反,它们使用底层数据_创建_一个新实例。

TypedArray

DataView

Buffer

string

作为 UTF-8:

number[]

Blob

ReadableStream

以下代码片段创建一个 ReadableStream 并将整个 ArrayBuffer 作为一个数据块入队。
要以数据块形式流式传输 ArrayBuffer,使用 Uint8Array 视图并将每个数据块入队。

TypedArray

ArrayBuffer

buffer 属性是底层的 ArrayBufferTypedArray 可能是该缓冲区_切片_的一个视图,因此大小可能不同。

DataView

要创建覆盖与 TypedArray 相同字节范围的 DataView

Buffer

string

作为 UTF-8:

number[]

Blob

ReadableStream

要以数据块形式流式传输 ArrayBuffer,将 TypedArray 分割成数据块并逐个入队。

DataView

ArrayBuffer

TypedArray

仅当 DataViewbyteLengthTypedArray 子类的 BYTES_PER_ELEMENT 的倍数时才有效。

Buffer

string

作为 UTF-8:

number[]

Blob

ReadableStream

要以数据块形式流式传输 ArrayBuffer,将 DataView 分割成数据块并逐个入队。

Buffer

ArrayBuffer

TypedArray

DataView

string

作为 UTF-8:
作为 base64:
作为十六进制:

number[]

Blob

ReadableStream

要以数据块形式流式传输 ArrayBuffer,将 Buffer 分割成数据块并逐个入队。

Blob

ArrayBuffer

TypedArray

DataView

Buffer

string

作为 UTF-8:

number[]

ReadableStream

ReadableStream

Response 是一个常见的中间件,用于将 ReadableStream 转换为其他格式。
但这种方法很冗长,而且增加了不必要的开销。Bun 实现了优化的便捷函数,用于将 ReadableStream 转换为各种二进制格式。

ArrayBuffer

Uint8Array

TypedArray

DataView

Buffer

string

作为 UTF-8:

number[]

Bun 提供了一个工具函数,用于将 ReadableStream 解析为其数据块数组。每个数据块可以是字符串、类型化数组或 ArrayBuffer

Blob

ReadableStream

要将 ReadableStream 拆分为两个可以独立消费的流: