Movatterモバイル変換


[0]ホーム

URL:


  1. 面向开发者的 Web 技术
  2. JavaScript
  3. JavaScript 参考
  4. JavaScript 标准内置对象
  5. ArrayBuffer

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in EnglishAlways switch to English

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 选项来使其大小可变。你可以通过访问其resizablemaxByteLength 属性来查询ArrayBuffer 的大小是否可变以及其最大值。你可以通过调用resize() 为可变大小的ArrayBuffer 分配一个新的大小。新的字节会被初始化为 0。

这些特性使得调整ArrayBuffer 的大小更加高效——否则,你必须使用新的大小创建一个缓冲副本。这也使得 JavaScript 在这方面与 WebAssembly 相当(Wasm 线性内存可以使用WebAssembly.Memory.prototype.grow() 调整大小)。

传输 ArrayBuffer

ArrayBuffer 对象可以在不同的执行上下文之间传输,就像Web WorkerService 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 的字节内容的副本。如果beginend 为负数,则它将从数组的末尾开始计算索引,而非从数组的开头。

ArrayBuffer.prototype.transfer()

创建一个新的ArrayBuffer 对象,其内容是与此缓冲区相同的字节内容,然后分离此缓冲区。

ArrayBuffer.prototype.transferToFixedLength()

创建一个新的不可调整大小的ArrayBuffer 对象,其内容与此缓冲区相同,然后分离此缓冲区。

示例

创建 ArrayBuffer

下面的例子创建了一个 8 字节的缓冲区,并使用Int32Array 视图引用它。

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

规范

Specification
ECMAScript® 2026 Language Specification
# sec-arraybuffer-objects

浏览器兼容性

参见

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp