ArrayBuffer.prototype.transferToFixedLength()

Baseline 2024
新推出

自 ⁨2024 年 3 月⁩ 起,此功能可在最新的设备和浏览器版本上运行。此功能可能不适用于较旧的设备或浏览器。

transferToFixedLength() 方法用于 ArrayBuffer 实例,它会创建一个具有相同字节内容的新、不可调整大小的 ArrayBuffer,然后分离(detach)原始缓冲区。

语法

js
transferToFixedLength()
transferToFixedLength(newByteLength)

参数

newByteLength

ArrayBufferbyteLength。默认为此 ArrayBufferbyteLength

  • 如果 newByteLength 小于此 ArrayBufferbyteLength,则会丢弃“溢出”的字节。
  • 如果 newByteLength 大于此 ArrayBufferbyteLength,则额外的字节将用零填充。

返回值

一个新的 ArrayBuffer 对象。其内容初始化为此 ArrayBuffer 的内容,并且任何额外的字节将用零填充。新 ArrayBuffer 始终是不可调整大小的。原始 ArrayBuffer 将被分离。

异常

TypeError

如果此 ArrayBuffer 已被分离,或者它只能通过指定的操作来分离,则会抛出此错误。目前,只有某些 Web API 能够创建具有指定分离方法的 ArrayBuffer 对象,例如 GPUBuffer.getMappedRange()WebAssembly.Memory.buffer

描述

transfer() 不同,transferToFixedLength() 始终创建一个不可调整大小的 ArrayBuffer。这意味着 newByteLength 可以大于 maxByteLength,即使此 ArrayBuffer 是可调整大小的。有关更多信息,请参阅 Transferring ArrayBuffers

示例

将可调整大小的 ArrayBuffer 传输到固定长度

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

const buffer2 = buffer.transferToFixedLength();
console.log(buffer2.byteLength); // 8
console.log(buffer2.resizable); // false
const view2 = new Uint8Array(buffer2);
console.log(view2[1]); // 2
console.log(view2[7]); // 4

使用 transferToFixedLengthnewByteLength 可以大于原始 ArrayBuffermaxByteLength

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

const buffer2 = buffer.transferToFixedLength(20);
console.log(buffer2.byteLength); // 20
console.log(buffer2.resizable); // false
const view2 = new Uint8Array(buffer2);
console.log(view2[1]); // 2
console.log(view2[7]); // 4

规范

规范
ECMAScript® 2026 语言规范
# sec-arraybuffer.prototype.transfertofixedlength

浏览器兼容性

另见