ArrayBuffer
Baseline 广泛可用 *
ArrayBuffer 对象用于表示通用的原始二进制数据缓冲区。
它是一个字节数组,在其他语言中常被称为“字节数组”。您不能直接操作 ArrayBuffer 的内容;相反,您需要创建 类型化数组对象 或 DataView 对象,这些对象以特定格式表示缓冲区,然后使用它们来读取和写入缓冲区的内容。
ArrayBuffer() 构造函数会创建一个指定字节长度的新 ArrayBuffer。您还可以从现有数据中获取 array buffer,例如,从 Base64 字符串或 从本地文件 中获取。
ArrayBuffer 是一个 可转移对象。
描述
调整 ArrayBuffer 的大小
通过在调用 ArrayBuffer() 构造函数时包含 maxByteLength 选项,可以使 ArrayBuffer 对象可调整大小。您可以通过访问其 resizable 和 maxByteLength 属性,分别查询 ArrayBuffer 是否可调整大小以及其最大大小是多少。您可以使用 resize() 调用为可调整大小的 ArrayBuffer 分配新大小。新字节将被初始化为 0。
这些功能使得调整 ArrayBuffer 的大小更加高效——否则,您需要创建一个新大小的缓冲区副本。这也在这一点上使 JavaScript 与 WebAssembly 保持一致(Wasm 线性内存可以使用 WebAssembly.Memory.prototype.grow() 进行调整)。
转移 ArrayBuffers
ArrayBuffer 对象可以通过 结构化克隆算法 在不同的执行上下文之间转移,例如 Web Workers 或 Service 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,其内容是此ArrayBuffer从begin(包含)到end(不包含)的字节副本。如果begin或end为负数,它将引用数组末尾的索引,而不是开头的索引。 ArrayBuffer.prototype.transfer()-
创建一个具有与此缓冲区相同字节内容的新
ArrayBuffer,然后分离此缓冲区。 ArrayBuffer.prototype.transferToFixedLength()-
创建一个具有与此缓冲区相同字节内容的新不可调整大小的
ArrayBuffer,然后分离此缓冲区。
示例
创建 ArrayBuffer
在此示例中,我们创建一个 8 字节的缓冲区,并使用指向该缓冲区的 Int32Array 视图
const buffer = new ArrayBuffer(8);
const view = new Int32Array(buffer);
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-arraybuffer-objects |
浏览器兼容性
加载中…