ArrayBuffer.prototype.transfer()
Baseline 2024Newly available
Since March 2024, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
Die transfer()
Methode von ArrayBuffer
-Instanzen erstellt einen neuen ArrayBuffer
mit demselben Byte-Inhalt wie dieser Puffer und trennt dann diesen Puffer.
Syntax
transfer()
transfer(newByteLength)
Parameter
newByteLength
Optional-
Die
byteLength
des neuenArrayBuffer
. Standardmäßig entspricht dies derbyteLength
diesesArrayBuffer
.- Wenn
newByteLength
kleiner ist als diebyteLength
diesesArrayBuffer
, werden die "überflüssigen" Bytes entfernt. - Wenn
newByteLength
größer ist als diebyteLength
diesesArrayBuffer
, werden die zusätzlichen Bytes mit Nullen gefüllt. - Wenn dieser
ArrayBuffer
anpassbar ist, darfnewByteLength
nicht größer sein als seinemaxByteLength
.
- Wenn
Rückgabewert
Ein neues ArrayBuffer
-Objekt. Sein Inhalt wird mit dem Inhalt dieses ArrayBuffer
initialisiert, und zusätzliche Bytes, falls vorhanden, werden mit Nullen gefüllt. Der neue ArrayBuffer
ist anpassbar, wenn und nur wenn dieser ArrayBuffer
anpassbar ist, in diesem Fall ist seine maxByteLength
dieselbe wie die dieses ArrayBuffer
. Der ursprüngliche ArrayBuffer
wird getrennt.
Ausnahmen
RangeError
-
Wird ausgelöst, wenn dieser
ArrayBuffer
anpassbar ist undnewByteLength
größer ist als diemaxByteLength
diesesArrayBuffer
. TypeError
-
Wird ausgelöst, wenn dieser
ArrayBuffer
bereits getrennt ist.
Beschreibung
Die transfer()
-Methode führt denselben Vorgang wie der strukturierte Klon-Algorithmus durch. Sie kopiert die Bytes dieses ArrayBuffer
in ein neues ArrayBuffer
-Objekt und trennt dann dieses ArrayBuffer
-Objekt. Weitere Informationen finden Sie unter Übertragung von ArrayBuffers.
transfer()
bewahrt die Anpassbarkeit dieses ArrayBuffer
. Wenn Sie möchten, dass der neue ArrayBuffer
nicht anpassbar ist, verwenden Sie transferToFixedLength()
stattdessen. Es gibt keine Möglichkeit, einen Puffer zu übertragen, der einen Puffer fester Länge anpassbar macht.
transfer()
ist sehr effizient, da Implementierungen diese Methode als Null-Kopie-Bewegung oder als realloc
implementieren können — es muss keine tatsächliche Kopie der Daten erfolgen.
Beispiele
Übertragen eines 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
Übertragen eines anpassbaren 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
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-arraybuffer.prototype.transfer |