From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../global_objects/arraybuffer/transfer/index.html | 126 +++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 files/ja/web/javascript/reference/global_objects/arraybuffer/transfer/index.html (limited to 'files/ja/web/javascript/reference/global_objects/arraybuffer/transfer') diff --git a/files/ja/web/javascript/reference/global_objects/arraybuffer/transfer/index.html b/files/ja/web/javascript/reference/global_objects/arraybuffer/transfer/index.html new file mode 100644 index 0000000000..2070e902a4 --- /dev/null +++ b/files/ja/web/javascript/reference/global_objects/arraybuffer/transfer/index.html @@ -0,0 +1,126 @@ +--- +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 +--- +
{{JSRef}} {{SeeCompatTable}}
+ +

静的な ArrayBuffer.transfer() メソッドは、oldBuffer のデータから得られる内容の新しい ArrayBuffer を返し、newByteLength によって切断されるかゼロ拡張されます。newByteLengthundefined なら、oldBufferbyteLength が使われます。この操作により oldBuffer はデタッチ状態のままになります。

+ +

構文

+ +
ArrayBuffer.transfer(oldBuffer [, newByteLength]);
+ +

引数

+ +
+
oldBuffer
+
転送するための {{jsxref("ArrayBuffer")}} オブジェクト
+
newByteLength
+
新しい ArrayBuffer オブジェクトのバイト長
+
+ +

戻り値

+ +

新しい 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")}}

+ +

関連情報

+ + -- cgit v1.2.3-54-g00ecf