ArrayBuffer.prototype.transfer()
Baseline
2024
Newly 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 ab.
Syntax
transfer()
transfer(newByteLength)
Parameter
newByteLengthOptional-
Der
byteLengthdes neuenArrayBuffer. Standardmäßig ist dies derbyteLengthdiesesArrayBuffer.- Wenn
newByteLengthkleiner als derbyteLengthdiesesArrayBufferist, werden die "überlaufenden" Bytes verworfen. - Wenn
newByteLengthgrößer als derbyteLengthdiesesArrayBufferist, werden die zusätzlichen Bytes mit Nullen gefüllt. - Wenn dieser
ArrayBuffervergrößerbar ist, darfnewByteLengthnicht größer als seinmaxByteLengthsein.
- Wenn
Rückgabewert
Ein neues ArrayBuffer Objekt. Sein Inhalt wird auf den Inhalt dieses ArrayBuffer initialisiert, und zusätzliche Bytes, falls vorhanden, werden mit Nullen gefüllt. Der neue ArrayBuffer ist nur dann vergrößerbar, wenn auch dieser ArrayBuffer vergrößerbar ist, in diesem Fall ist sein maxByteLength das gleiche wie das dieses ArrayBuffer. Der ursprüngliche ArrayBuffer wird getrennt.
Ausnahmen
RangeError-
Wird ausgelöst, wenn dieser
ArrayBuffervergrößerbar ist undnewByteLengthgrößer ist als dermaxByteLengthdiesesArrayBuffer. TypeError-
Wird ausgelöst, wenn dieser
ArrayBufferbereits getrennt ist oder wenn er nur durch bestimmte Operationen getrennt werden kann. Derzeit sind es nur bestimmte Web-APIs, die in der Lage sind,ArrayBufferObjekte mit bestimmten Trennmethoden zu erstellen, wie zum BeispielGPUBuffer.getMappedRange()undWebAssembly.Memory.buffer.
Beschreibung
Die transfer() Methode führt dieselbe Operation wie der Structured Clone Algorithmus aus. Sie kopiert die Bytes dieses ArrayBuffer in ein neues ArrayBuffer Objekt und trennt dann dieses ArrayBuffer Objekt. Weitere Informationen finden Sie unter Übergabe von ArrayBuffers.
transfer() bewahrt die Vergrößerbarkeit dieses ArrayBuffer. Wenn Sie möchten, dass der neue ArrayBuffer nicht vergrößerbar ist, verwenden Sie stattdessen transferToFixedLength(). Es gibt keinen Weg, einen Puffer zu übertragen, der einen Festlängenpuffer vergrößerbar macht.
transfer() ist sehr effizient, da Implementierungen diese Methode als Zero-Copy-Verschiebung oder als realloc implementieren können – es muss keine tatsächliche Kopie der Daten erfolgen.
Beispiele
>Ein ArrayBuffer übertragen
// 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
Einen vergrößerbaren ArrayBuffer übertragen
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> |
Browser-Kompatibilität
Loading…