ArrayBuffer
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
* Some parts of this feature may have varying levels of support.
ArrayBuffer 对象用来表示通用的原始二进制数据缓冲区。
它是一个字节数组,通常在其他语言中称为“byte array”。你不能直接操作 ArrayBuffer 中的内容;而是要通过类型化数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。
ArrayBuffer() 构造函数创建一个以字节为单位的给定长度的新 ArrayBuffer。你也可以从现有的数据(例如,从 Base64 字符串或者从本地文件)获取数组缓冲区。
ArrayBuffer 是一个可转移对象。
描述
>调整 ArrayBuffer 的大小
ArrayBuffer 对象可以通过在调用 ArrayBuffer() 构造函数时包含 maxByteLength 选项来使其大小可变。你可以通过访问其 resizable 和 maxByteLength 属性来查询 ArrayBuffer 的大小是否可变以及其最大值。你可以通过调用 resize() 为可变大小的 ArrayBuffer 分配一个新的大小。新的字节会被初始化为 0。
这些特性使得调整 ArrayBuffer 的大小更加高效——否则,你必须使用新的大小创建一个缓冲副本。这也使得 JavaScript 在这方面与 WebAssembly 相当(Wasm 线性内存可以使用 WebAssembly.Memory.prototype.grow() 调整大小)。
传输 ArrayBuffer
ArrayBuffer 对象可以在不同的执行上下文之间传输,就像 Web Worker 或 Service Worker 那样,使用结构化克隆算法。这可以通过在 Worker.postMessage() 或 ServiceWorker.postMessage() 的调用中传入 ArrayBuffer 对象作为可转移对象来完成。在纯 JavaScript 中,也可以使用 transfer() 或 transferToFixedLength() 方法来转移内存的所有权。
当一个 ArrayBuffer 对象被传输时,它原来的副本会被分离(detached),这意味着它不再可用。在任何时候,只有一个 ArrayBuffer 的副本实际拥有底层内存。分离的缓冲区具有以下行为:
byteLength变为 0(在缓冲区和关联的类型化数组视图中)。- 所有实例方法,比如
resize()和slice(),会在调用时抛出TypeError。关联的类型化数组视图的方法也会抛出TypeError。
你可以通过其 detached 属性来检查 ArrayBuffer 是否已分离。
构造函数
ArrayBuffer()-
创建一个新的
ArrayBuffer对象。
静态属性
ArrayBuffer[Symbol.species]-
用于创建派生对象的构造函数。
静态方法
ArrayBuffer.isView()-
如果
arg是 ArrayBuffer 视图之一,则返回true,例如类型化数组对象或者DataView。否则返回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对象,其内容是从begin(包含)到end(不包含)的ArrayBuffer的字节内容的副本。如果begin或end为负数,则它将从数组的末尾开始计算索引,而非从数组的开头。 ArrayBuffer.prototype.transfer()-
创建一个新的
ArrayBuffer对象,其内容是与此缓冲区相同的字节内容,然后分离此缓冲区。 ArrayBuffer.prototype.transferToFixedLength()-
创建一个新的不可调整大小的
ArrayBuffer对象,其内容与此缓冲区相同,然后分离此缓冲区。
示例
>创建 ArrayBuffer
下面的例子创建了一个 8 字节的缓冲区,并使用 Int32Array 视图引用它。
const buffer = new ArrayBuffer(8);
const view = new Int32Array(buffer);
规范
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-arraybuffer-objects> |
浏览器兼容性
Loading…