ArrayBuffer
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
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 Language Specification # sec-arraybuffer-objects |
浏览器兼容性
BCD tables only load in the browser