ArrayBuffer

Baseline 廣泛可用 *

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

* 此特性的某些部分可能存在不同級別的支援。

ArrayBuffer 物件用於表示通用的原始二進位制資料緩衝區。

它是一個位元組陣列,在其他語言中常被稱為“位元組陣列”。您不能直接操作 ArrayBuffer 的內容;相反,您需要建立 型別化陣列物件DataView 物件,這些物件以特定格式表示緩衝區,然後使用它們來讀取和寫入緩衝區的內容

ArrayBuffer() 建構函式會建立一個指定位元組長度的新 ArrayBuffer。您還可以從現有資料中獲取 array buffer,例如,從 Base64 字串或 從本地檔案 中獲取。

ArrayBuffer 是一個 可轉移物件

描述

調整 ArrayBuffer 的大小

透過在呼叫 ArrayBuffer() 建構函式時包含 maxByteLength 選項,可以使 ArrayBuffer 物件可調整大小。您可以透過訪問其 resizablemaxByteLength 屬性,分別查詢 ArrayBuffer 是否可調整大小以及其最大大小是多少。您可以使用 resize() 呼叫為可調整大小的 ArrayBuffer 分配新大小。新位元組將被初始化為 0。

這些功能使得調整 ArrayBuffer 的大小更加高效——否則,您需要建立一個新大小的緩衝區副本。這也在這一點上使 JavaScript 與 WebAssembly 保持一致(Wasm 線性記憶體可以使用 WebAssembly.Memory.prototype.grow() 進行調整)。

轉移 ArrayBuffers

ArrayBuffer 物件可以透過 結構化克隆演算法 在不同的執行上下文之間轉移,例如 Web WorkersService 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,其內容是此 ArrayBufferbegin(包含)到 end(不包含)的位元組副本。如果 beginend 為負數,它將引用陣列末尾的索引,而不是開頭的索引。

ArrayBuffer.prototype.transfer()

建立一個具有與此緩衝區相同位元組內容的新 ArrayBuffer,然後分離此緩衝區。

ArrayBuffer.prototype.transferToFixedLength()

建立一個具有與此緩衝區相同位元組內容的新不可調整大小的 ArrayBuffer,然後分離此緩衝區。

示例

建立 ArrayBuffer

在此示例中,我們建立一個 8 位元組的緩衝區,並使用指向該緩衝區的 Int32Array 檢視

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

規範

規範
ECMAScript® 2026 語言規範
# sec-arraybuffer-objects

瀏覽器相容性

另見