--- title: ArrayBuffer.transfer() slug: Web/JavaScript/Reference/Global_Objects/ArrayBuffer/transfer tags: - ArrayBuffer - Experimental - JavaScript - Method - Reference - TypedArrays translation_of: Archive/Web/JavaScript/ArrayBuffer.transfer ---
Die statische ArrayBuffer.transfer()
Funktion gibt einen neuen ArrayBuffer
mit dem Inhalt von oldBuffer
. Je nachdem, wei die newByteLength
gesetzt ist, werden die Daten abgeschnitten oder erweitert. Wenn newByteLength
nicht gesetzt ist, wird die byteLength
von oldBuffer
benutzt. Diese Operation bringt oldBuffer
in einen detached Status.
ArrayBuffer.transfer(oldBuffer [, newByteLength]);
oldBuffer
ArrayBuffer
Objektes.Ein neues ArrayBuffer
Objekt.
Die ArrayBuffer.transfer()
Methode erlaubt es ein ArrayBuffer
zu vergrößern und zu detachen. Die Möglichkeit ein ArrayBuffer
zu vergrößern ohne es zu kopieren, hat den Vorteil, dass es viel schneller für große Buffer ist (ähnlich wie bei realloc). Die Möglichkeit, dass ein ArrayBuffer
detachet wird, gibt dem Entwickler die explizite Kontrolle über das freigeben des internen Speichers. Dieses vermeidet das Entfernen aller Referenzen und das Warten auf die Garbage Collection.
var buf1 = new ArrayBuffer(40); new Int32Array(buf1)[0] = 42; var buf2 = ArrayBuffer.transfer(buf1, 80); buf1.byteLength; // 0 but if you use the polyfill then the value is still 40 buf2.byteLength; // 80 new Int32Array(buf2)[0]; // 42 var buf3 = ArrayBuffer.transfer(buf2, 0); buf2.byteLength; // 0 but if you use the polyfill then the value is still 80 buf3.byteLength; // 0
Für Browser, die die Funktion nicht nativ unterstützen, gibt es die Möglichkeit folgenden Quelltext am Anfang eines Skriptes einzufügen, um die Funktion transfer()
zu benutzen. Diese Funktion ist nicht exakt die in der API beschriebene, weil Browser, die die Funktion unterstützen, direkten Zugriff auf die C++ Funktion realloc()
haben, welche die Länge des Speichers erhöht und nur eine Kopie anlegt, wenn es nötig ist. Im Gegensatz dazu kopiert der folgende Pollyfill alles immer in neuen Speicher. Diese Funktion transferiert die Daten jedoch von einem ArrayBuffer
zu einem anderen.
if (!ArrayBuffer.transfer) { ArrayBuffer.transfer = function(source, length) { if (!(source instanceof ArrayBuffer)) throw new TypeError('Source must be an instance of ArrayBuffer'); if (length <= source.byteLength) return source.slice(0, length); var sourceView = new Uint8Array(source), destView = new Uint8Array(new ArrayBuffer(length)); destView.set(sourceView); return dest.buffer; }; }
Ist in keiner aktuellen Spezifikation enthalten, wird aber in der Zukunft für ECMA-262 geplant.
{{Compat("javascript.builtins.ArrayBuffer.transfer")}}