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

浏览器兼容性

另见