--- title: ArrayBuffer.transfer() slug: Web/JavaScript/Reference/Global_Objects/ArrayBuffer/transfer tags: - ArrayBuffer - ECMAScript7 - Experimental - Expérimental(2) - JavaScript - Method - Reference - Référence(2) - TypedArrays translation_of: Archive/Web/JavaScript/ArrayBuffer.transfer ---
静的な ArrayBuffer.transfer() メソッドは、oldBuffer のデータから得られる内容の新しい ArrayBuffer を返し、newByteLength によって切断されるかゼロ拡張されます。newByteLength が undefined なら、oldBuffer の byteLength が使われます。この操作により oldBuffer はデタッチ状態のままになります。
ArrayBuffer.transfer(oldBuffer [, newByteLength]);
oldBufferArrayBuffer オブジェクトのバイト長新しい ArrayBuffer オブジェクト。
ArrayBuffer.transfer() メソッドによって、ArrayBuffer オブジェクトを成長し、デタッチできます。コピーなしで ArrayBuffer を成長される能力は大規模バッファに対してもっと早くなる利点を持っています。ArrayBuffer をデタッチする機能によって、基底メモリがリリースされるときを開発者が明示的に制御できます。これにより、すべての参照を削除し、ガベージコレクションを待たずに済みます。
var buf1 = new ArrayBuffer(40); new Int32Array(buf1)[0] = 42; var buf2 = ArrayBuffer.transfer(buf1, 80); buf1.byteLength; // 0 buf2.byteLength; // 80 new Int32Array(buf2)[0]; // 42 var buf3 = ArrayBuffer.transfer(buf2, 0); buf2.byteLength; // 0 buf3.byteLength; // 0
次のコードをスクリプトの先頭に挿入することで、transfer() の機能の大部分をネイティブにサポートしていない環境でも対処できるようになります。これはこの API と完全に同じではありませんが、この関数はある ArrayBuffer からそのほかの ArrayBuffer にデータを変換します。
if (!ArrayBuffer.transfer) {
ArrayBuffer.transfer = function(source, length) {
source = Object(source);
var dest = new ArrayBuffer(length);
if (!(source instanceof ArrayBuffer) || !(dest instanceof ArrayBuffer)) {
throw new TypeError('Source and destination must be ArrayBuffer instances');
}
if (dest.byteLength >= source.byteLength) {
var nextOffset = 0;
var leftBytes = source.byteLength;
var wordSizes = [8, 4, 2, 1];
wordSizes.forEach(function(_wordSize_) {
if (leftBytes >= _wordSize_) {
var done = transferWith(_wordSize_, source, dest, nextOffset, leftBytes);
nextOffset = done.nextOffset;
leftBytes = done.leftBytes;
}
});
}
return dest;
function transferWith(wordSize, source, dest, nextOffset, leftBytes) {
var ViewClass = Uint8Array;
switch (wordSize) {
case 8:
ViewClass = Float64Array;
break;
case 4:
ViewClass = Float32Array;
break;
case 2:
ViewClass = Uint16Array;
break;
case 1:
ViewClass = Uint8Array;
break;
default:
ViewClass = Uint8Array;
break;
}
var view_source = new ViewClass(source, nextOffset, Math.trunc(leftBytes / wordSize));
var view_dest = new ViewClass(dest, nextOffset, Math.trunc(leftBytes / wordSize));
for (var i = 0; i < view_dest.length; i++) {
view_dest[i] = view_source[i];
}
return {
nextOffset : view_source.byteOffset + view_source.byteLength,
leftBytes : source.byteLength - (view_source.byteOffset + view_source.byteLength)
}
}
};
}
いづれの現行仕様のドラフトにも含まれていませんが、ECMA-262 エディションの機能として提案されました。
{{Compat("javascript.builtins.ArrayBuffer.transfer")}}