ArrayBuffer.prototype.transfer()
transfer() 方法是 ArrayBuffer 例項的一個方法,它建立一個具有與此緩衝區相同位元組內容的新 ArrayBuffer,然後分離(detach)此緩衝區。
語法
transfer()
transfer(newByteLength)
引數
newByteLength可選-
新
ArrayBuffer的byteLength。預設為此ArrayBuffer的byteLength。- 如果
newByteLength小於此ArrayBuffer的byteLength,則會丟棄“溢位”的位元組。 - 如果
newByteLength大於此ArrayBuffer的byteLength,則額外的位元組將用零填充。 - 如果此
ArrayBuffer是可調整大小的,則newByteLength不能大於其maxByteLength。
- 如果
返回值
一個新的 ArrayBuffer 物件。其內容被初始化為此 ArrayBuffer 的內容,並且任何額外的位元組都用零填充。新的 ArrayBuffer 是否可調整大小取決於此 ArrayBuffer 是否可調整大小,在這種情況下,它的 maxByteLength 與此 ArrayBuffer 相同。原始 ArrayBuffer 將被分離。
異常
RangeError-
如果此
ArrayBuffer是可調整大小的,並且newByteLength大於此ArrayBuffer的maxByteLength,則丟擲此錯誤。 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
// 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
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 |
瀏覽器相容性
載入中…