ArrayBuffer

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

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

ArrayBuffer() 构造函数创建一个以字节为单位的给定长度的新 ArrayBuffer。您也可以从现有数据中获取数组缓冲区,例如,从 Base64 字符串或 本地文件

ArrayBuffer 是一个 可传输对象

描述

调整 ArrayBuffer 大小

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

这些功能使调整 ArrayBuffer 大小更加高效——否则,您必须创建一个具有新大小的缓冲区副本。它还在这方面为 JavaScript 提供了与 WebAssembly 的同等功能(Wasm 线性内存可以使用 WebAssembly.Memory.prototype.grow() 调整大小)。

传输 ArrayBuffer

ArrayBuffer 对象可以使用 Web WorkersService Workers 等不同的执行上下文在它们之间传输,方法是使用 结构化克隆算法。这是通过将 ArrayBuffer 作为 可传输对象 传递给 Worker.postMessage()ServiceWorker.postMessage() 调用来完成的。在纯 JavaScript 中,您还可以使用其 transfer()transferToFixedLength() 方法将内存的所有权从一个 ArrayBuffer 传递到另一个 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.prototype.resize() 方法(如果 ArrayBuffer 可调整大小)进行更改。

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

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

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

规范

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

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参见