ArrayBuffer.prototype.transfer()

Baseline 2024
新推出

自 ⁨2024 年 3 月⁩ 起,此功能可在最新的裝置和瀏覽器版本上執行。此功能可能不適用於較舊的裝置或瀏覽器。

transfer() 方法是 ArrayBuffer 例項的一個方法,它建立一個具有與此緩衝區相同位元組內容的新 ArrayBuffer,然後分離(detach)此緩衝區。

語法

js
transfer()
transfer(newByteLength)

引數

newByteLength 可選

ArrayBufferbyteLength。預設為此 ArrayBufferbyteLength

  • 如果 newByteLength 小於此 ArrayBufferbyteLength,則會丟棄“溢位”的位元組。
  • 如果 newByteLength 大於此 ArrayBufferbyteLength,則額外的位元組將用零填充。
  • 如果此 ArrayBuffer 是可調整大小的,則 newByteLength 不能大於其 maxByteLength

返回值

一個新的 ArrayBuffer 物件。其內容被初始化為此 ArrayBuffer 的內容,並且任何額外的位元組都用零填充。新的 ArrayBuffer 是否可調整大小取決於此 ArrayBuffer 是否可調整大小,在這種情況下,它的 maxByteLength 與此 ArrayBuffer 相同。原始 ArrayBuffer 將被分離。

異常

RangeError

如果此 ArrayBuffer 是可調整大小的,並且 newByteLength 大於此 ArrayBuffermaxByteLength,則丟擲此錯誤。

TypeError

如果此 ArrayBuffer 已經被分離,或者它只能透過指定的操作來分離,則丟擲此錯誤。目前,只有某些 Web API 能夠建立具有指定分離方法的 ArrayBuffer 物件,例如 GPUBuffer.getMappedRange()WebAssembly.Memory.buffer

描述

transfer() 方法執行的操作與 結構化克隆演算法相同。它將此 ArrayBuffer 的位元組複製到一個新的 ArrayBuffer 物件中,然後分離(detach)此 ArrayBuffer 物件。有關更多資訊,請參閱 Transferring ArrayBuffers

transfer() 保留此 ArrayBuffer 的可調整大小性。如果您希望新的 ArrayBuffer 是不可調整大小的,請改用 transferToFixedLength()。無法將一個緩衝區傳輸到一個使其變為可調整大小的固定長度緩衝區。

transfer() 非常高效,因為實現可能會將此方法實現為零複製移動或 realloc — 實際上不需要複製資料。

示例

Transferring an ArrayBuffer

js
// Create an ArrayBuffer and write a few bytes
const buffer = new ArrayBuffer(8);
const view = new Uint8Array(buffer);
view[1] = 2;
view[7] = 4;

// Copy the buffer to the same size
const buffer2 = buffer.transfer();
console.log(buffer.detached); // true
console.log(buffer2.byteLength); // 8
const view2 = new Uint8Array(buffer2);
console.log(view2[1]); // 2
console.log(view2[7]); // 4

// Copy the buffer to a smaller size
const buffer3 = buffer2.transfer(4);
console.log(buffer3.byteLength); // 4
const view3 = new Uint8Array(buffer3);
console.log(view3[1]); // 2
console.log(view3[7]); // undefined

// Copy the buffer to a larger size
const buffer4 = buffer3.transfer(8);
console.log(buffer4.byteLength); // 8
const view4 = new Uint8Array(buffer4);
console.log(view4[1]); // 2
console.log(view4[7]); // 0

// Already detached, throws TypeError
buffer.transfer(); // TypeError: Cannot perform ArrayBuffer.prototype.transfer on a detached ArrayBuffer

Transferring a resizable ArrayBuffer

js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });
const view = new Uint8Array(buffer);
view[1] = 2;
view[7] = 4;

// Copy the buffer to a smaller size
const buffer2 = buffer.transfer(4);
console.log(buffer2.byteLength); // 4
console.log(buffer2.maxByteLength); // 16
const view2 = new Uint8Array(buffer2);
console.log(view2[1]); // 2
console.log(view2[7]); // undefined
buffer2.resize(8);
console.log(view2[7]); // 0

// Copy the buffer to a larger size within maxByteLength
const buffer3 = buffer2.transfer(12);
console.log(buffer3.byteLength); // 12

// Copy the buffer to a larger size than maxByteLength
buffer3.transfer(20); // RangeError: Invalid array buffer length

規範

規範
ECMAScript® 2026 語言規範
# sec-arraybuffer.prototype.transfer

瀏覽器相容性

另見