JavaScriptにおけるArrayBuffer
と二進数配列(binary arrays)は、バイナリデータの処理を効率的に行うための強力なツールです。この2つは、特にバイナリデータの扱いを必要とするアプリケーション、例えばWeb APIでのデータ送受信や画像、音声、動画の処理に非常に重要です。この記事では、ArrayBuffer
とその関連機能について、詳細に説明します。
1. ArrayBuffer
とは?
ArrayBuffer
は、固定長のバイナリデータのバッファを表現するためのJavaScriptのオブジェクトです。これは直接的にはデータを格納するものではなく、他の型のビュー(例えば、Uint8Array
やFloat32Array
など)がこのバッファを参照することによってデータを操作します。つまり、ArrayBuffer
はデータの格納場所としての役割を果たし、そのデータにアクセスするためには、ビューを通じて操作する必要があります。

例えば、ArrayBuffer
を使って1バイトのデータを保持する場合、Uint8Array
というビューを使用してアクセスします。
javascriptlet buffer = new ArrayBuffer(10); // 10バイトのバッファを作成
let view = new Uint8Array(buffer); // ArrayBufferをUint8Arrayとして扱う
view[0] = 255; // 最初の要素に255を設定
console.log(view[0]); // 255が表示される
2. ArrayBuffer
の生成と初期化
ArrayBuffer
はnew ArrayBuffer(size)
の構文で作成します。size
はバッファのサイズをバイト単位で指定します。
javascriptlet buffer = new ArrayBuffer(16); // 16バイトのバッファを作成
ArrayBuffer
の内容は、初期状態ではすべてゼロで埋められています。異なる型のデータを格納するためには、ビューを通じてアクセスする必要があります。
3. TypedArray
(型付き配列)
ArrayBuffer
は単独で使用されることは少なく、通常は「型付き配列」ビュー(TypedArray
)と一緒に使用されます。これにより、特定のデータ型の配列としてバッファにアクセスできます。JavaScriptにはいくつかの型付き配列があり、代表的なものは以下の通りです。
Int8Array
:8ビットの符号付き整数の配列Uint8Array
:8ビットの符号なし整数の配列Int16Array
:16ビットの符号付き整数の配列Uint16Array
:16ビットの符号なし整数の配列Int32Array
:32ビットの符号付き整数の配列Uint32Array
:32ビットの符号なし整数の配列Float32Array
:32ビットの浮動小数点数の配列Float64Array
:64ビットの浮動小数点数の配列
これらの型付き配列は、ArrayBuffer
を基にしてデータを格納し、指定した型でアクセスすることができます。
javascriptlet buffer = new ArrayBuffer(16);
let int32View = new Int32Array(buffer);
int32View[0] = 42; // 32ビット整数としてデータを格納
console.log(int32View[0]); // 42が表示される
4. DataView
とその利用
TypedArray
ビューは固定のデータ型に対してのみ操作が可能ですが、DataView
を使用することで、異なるデータ型を同じArrayBuffer
に格納することができます。DataView
は、データの型を意識せずにバッファ内の任意の位置にアクセスするための柔軟な方法を提供します。
javascriptlet buffer = new ArrayBuffer(16);
let dataView = new DataView(buffer);
dataView.setInt8(0, 42); // 0番目のバイトに符号付き整数を格納
dataView.setFloat32(1, 3.14); // 1番目のバイトに浮動小数点数を格納
console.log(dataView.getInt8(0)); // 42
console.log(dataView.getFloat32(1)); // 3.14
5. ArrayBuffer
の使用例
ArrayBuffer
は、特に次のようなシナリオで有効です。
5.1 バイナリデータの処理
画像ファイルや音声データなどのバイナリデータを扱う際、ArrayBuffer
を使用してバイナリ形式でデータを扱うことができます。例えば、FileReader
を使用してファイルを読み込むとき、読み込んだデータをArrayBuffer
として取得できます。
javascriptlet fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', function() {
let file = fileInput.files[0];
let reader = new FileReader();
reader.onload = function(event) {
let buffer = event.target.result; // これがArrayBuffer
console.log(buffer);
};
reader.readAsArrayBuffer(file);
});
5.2 Web APIとのデータのやり取り
WebブラウザのXMLHttpRequest
やFetch API
を使用して、バイナリデータ(例えば、画像や音声)をサーバーから取得する際にもArrayBuffer
が利用されます。特に、responseType
としてarraybuffer
を指定することで、サーバーから返されるバイナリデータをArrayBuffer
として受け取ることができます。
javascriptfetch('https://example.com/image.png')
.then(response => response.arrayBuffer())
.then(buffer => {
console.log(buffer); // ArrayBufferを表示
});
6. ArrayBuffer
のメモリ管理
ArrayBuffer
は、JavaScriptのガーベジコレクションによって自動的にメモリ管理されますが、バイナリデータを大規模に扱う場合は、メモリリークを避けるために適切に管理することが重要です。特に、ArrayBuffer
を大量に作成する場合は、その使用が終了した時点で明示的に破棄することを心掛けると良いでしょう。
javascriptlet buffer = new ArrayBuffer(1024 * 1024); // 1MBのバッファ
// バッファを使い終わった後、特に何もする必要はありません
7. まとめ
ArrayBuffer
は、バイナリデータを効率的に処理するための強力なツールです。TypedArray
やDataView
と組み合わせて使用することで、さまざまなデータ型にアクセスし、複雑なデータ操作を簡単に行うことができます。特に、画像や音声、動画のようなバイナリデータを扱う場面では、その重要性が際立ちます。ArrayBuffer
をうまく活用することで、パフォーマンスの高いアプリケーションを開発することができます。