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 |
浏览器兼容性
加载中…