ArrayBuffer

Baseline 广泛可用 *

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

* 此特性的某些部分可能存在不同级别的支持。

ArrayBuffer 对象用于表示通用的原始二进制数据缓冲区。

它是一个字节数组,在其他语言中常被称为“字节数组”。您不能直接操作 ArrayBuffer 的内容;相反,您需要创建 类型化数组对象DataView 对象,这些对象以特定格式表示缓冲区,然后使用它们来读取和写入缓冲区的内容

ArrayBuffer() 构造函数会创建一个指定字节长度的新 ArrayBuffer。您还可以从现有数据中获取 array buffer,例如,从 Base64 字符串或 从本地文件 中获取。

ArrayBuffer 是一个 可转移对象

描述

调整 ArrayBuffer 的大小

通过在调用 ArrayBuffer() 构造函数时包含 maxByteLength 选项,可以使 ArrayBuffer 对象可调整大小。您可以通过访问其 resizablemaxByteLength 属性,分别查询 ArrayBuffer 是否可调整大小以及其最大大小是多少。您可以使用 resize() 调用为可调整大小的 ArrayBuffer 分配新大小。新字节将被初始化为 0。

这些功能使得调整 ArrayBuffer 的大小更加高效——否则,您需要创建一个新大小的缓冲区副本。这也在这一点上使 JavaScript 与 WebAssembly 保持一致(Wasm 线性内存可以使用 WebAssembly.Memory.prototype.grow() 进行调整)。

转移 ArrayBuffers

ArrayBuffer 对象可以通过 结构化克隆算法 在不同的执行上下文之间转移,例如 Web WorkersService Workers。这可以通过在调用 Worker.postMessage()ServiceWorker.postMessage() 时将 ArrayBuffer 作为 可转移对象 来实现。在纯 JavaScript 中,您还可以使用其 transfer()transferToFixedLength() 方法将内存的所有权从一个 ArrayBuffer 转移到另一个。

ArrayBuffer 被转移时,其原始副本会变为已分离——这意味着它不再可用。在任何时刻,只有一个 ArrayBuffer 副本实际拥有对底层内存的访问权。已分离缓冲区具有以下行为:

  • byteLength 变为 0(在缓冲区和关联的类型化数组视图中)。
  • 调用如 resize()slice() 等方法会抛出 TypeError。关联的类型化数组视图的方法也会抛出 TypeError

您可以通过其 detached 属性检查 ArrayBuffer 是否已分离。

构造函数

ArrayBuffer()

创建一个新的 ArrayBuffer 对象。

静态属性

ArrayBuffer[Symbol.species]

用于创建派生对象的构造函数。

静态方法

ArrayBuffer.isView()

如果 arg 是 ArrayBuffer 视图之一(例如 类型化数组对象DataView),则返回 true。否则返回 false

实例属性

这些属性定义在 ArrayBuffer.prototype 上,并由所有 ArrayBuffer 实例共享。

ArrayBuffer.prototype.byteLength

ArrayBuffer 的大小(以字节为单位)。这在数组构造时建立,并且只有在 ArrayBuffer 可调整大小时才能使用 ArrayBuffer.prototype.resize() 方法进行更改。

ArrayBuffer.prototype.constructor

创建实例对象的构造函数。对于 ArrayBuffer 实例,初始值为 ArrayBuffer 构造函数。

ArrayBuffer.prototype.detached

只读。如果 ArrayBuffer 已分离(已转移),则返回 true,否则返回 false

ArrayBuffer.prototype.maxByteLength

ArrayBuffer 可以调整到的最大大小(以字节为单位),只读。这在数组构造时建立,并且不能更改。

ArrayBuffer.prototype.resizable

只读。如果 ArrayBuffer 可以调整大小,则返回 true,否则返回 false

ArrayBuffer.prototype[Symbol.toStringTag]

[Symbol.toStringTag] 属性的初始值为字符串 "ArrayBuffer"。此属性用于 Object.prototype.toString()

实例方法

ArrayBuffer.prototype.resize()

ArrayBuffer 调整为指定的字节大小。

ArrayBuffer.prototype.slice()

返回一个新的 ArrayBuffer,其内容是此 ArrayBufferbegin(包含)到 end(不包含)的字节副本。如果 beginend 为负数,它将引用数组末尾的索引,而不是开头的索引。

ArrayBuffer.prototype.transfer()

创建一个具有与此缓冲区相同字节内容的新 ArrayBuffer,然后分离此缓冲区。

ArrayBuffer.prototype.transferToFixedLength()

创建一个具有与此缓冲区相同字节内容的新不可调整大小的 ArrayBuffer,然后分离此缓冲区。

示例

创建 ArrayBuffer

在此示例中,我们创建一个 8 字节的缓冲区,并使用指向该缓冲区的 Int32Array 视图

js
const buffer = new ArrayBuffer(8);
const view = new Int32Array(buffer);

规范

规范
ECMAScript® 2026 语言规范
# sec-arraybuffer-objects

浏览器兼容性

另见