ArrayBuffer
ArrayBuffer
对象用于表示通用的原始二进制数据缓冲区。
它是一个字节数组,在其他语言中通常被称为“字节数组”。您不能直接操作 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 Workers 或 Service 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
,其内容是此ArrayBuffer
从begin
(含)到end
(不含)的字节的副本。如果begin
或end
为负数,则表示从数组的末尾开始的索引,而不是从开头开始的索引。 ArrayBuffer.prototype.transfer()
-
创建一个新的
ArrayBuffer
,其字节内容与该缓冲区相同,然后分离该缓冲区。 ArrayBuffer.prototype.transferToFixedLength()
-
创建一个新的不可调整大小的
ArrayBuffer
,其字节内容与该缓冲区相同,然后分离该缓冲区。
示例
创建 ArrayBuffer
在此示例中,我们使用 Int32Array
视图创建一个 8 字节缓冲区,该视图引用该缓冲区
const buffer = new ArrayBuffer(8);
const view = new Int32Array(buffer);
规范
规范 |
---|
ECMAScript 语言规范 # sec-arraybuffer-objects |
浏览器兼容性
BCD 表格仅在浏览器中加载