DataView ビューは ArrayBuffer の多様な数値型を、プラットフォームのエンディアンに関係なく読み書きするための低水準インターフェイスを提供します。
このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 https://github.com/mdn/interactive-examples をクローンしてプルリクエストを送信してください。
構文
new DataView(buffer [, byteOffset [, byteLength]])
引数
buffer- 新たな
DataViewオブジェクトのための記憶領域として用いる、既存のArrayBufferまたはSharedArrayBufferです。 byteOffsetOptional- 指定されたバッファーで、新たなビューが参照する最初のバイト位置を示すオフセットを、バイト単位で示します。省略した場合、バッファーのビューは最初のバイト位置から参照し始めます。
byteLengthOptional- バイト配列内の要素数です。省略した場合、ビューの長さはバッファーの長さと同じになります。
返値
指定されたデータバッファーを表す、新たな DataView オブジェクトを返します。 (これはおそらく役立つ説明ではありません。)
返却されるオブジェクトはバイト配列バッファーの「インタープリター」として考えることができます。 — これは読み書き時に、バッファーに正しく格納するために数値を変換する方法を知っています。つまり、整数型と浮動小数点型の変換、エンディアン、その他の二進数形式で数値を表す詳細です。
例外
RangeError-
指定されたビューの
byteOffsetおよびbyteLengthの結果が、バッファーの終端を超えた場合に発生します。例えば、バッファーの長さが16バイトで、
byteOffsetが8で、byteLengthが10である場合、バッファーの長さが2倍と不足するためにこのエラーが発生します。
説明
エンディアン
多バイトの数値形式は、マシンアーキテクチャによってメモリー内での表現が異なります。これは エンディアンで説明しています。 DataView のアクセサーは、プラットフォームアーキテクチャのエンディアンに関係なくデータにアクセスする方法を明確に制御する手段を提供します。
var littleEndian = (function() {
var buffer = new ArrayBuffer(2);
new DataView(buffer).setInt16(0, 256, true /* リトルエンディアン */);
// Int16Array はプラットフォームのエンディアンを使用する
return new Int16Array(buffer)[0] === 256;
})();
console.log(littleEndian); // true または false
64ビット整数値
JavaScript は現在のところ、64ビット整数値に標準で対応していないので、 DataView はネイティブの64ビット操作を提供していません。このようなことが発生した場合、応急処置として、独自で getUint64() 関数を実装して Number.MAX_SAFE_INTEGER までの制度の値を受け取れるようにします。
function getUint64(dataview, byteOffset, littleEndian) {
// 64ビット数を2つの32ビット (4バイト) の部分に分割する
const left = dataview.getUint32(byteOffset, littleEndian);
const right = dataview.getUint32(byteOffset+4, littleEndian);
// 2つの32ビットの値を結合する
const combined = littleEndian? left + 2**32*right : 2**32*left + right;
if (!Number.isSafeInteger(combined))
console.warn(combined, 'exceeds MAX_SAFE_INTEGER. Precision may be lost');
return combined;
}
他にも、完全な64ビットの幅が必要な場合、 BigInt を作成することもできます。さらに言えば、ネイティブの BigInt がユーザーランドライブラリの同等品よりもはるかに速いのですが、 JavaScript では BigInt は可変長であるという性質上、常に32ビット整数よりもはるかに遅くなります。
const BigInt = window.BigInt, bigThirtyTwo = BigInt(32), bigZero = BigInt(0);
function getUint64BigInt(dataview, byteOffset, littleEndian) {
// 64ビット数を2つの32ビット (4バイト) の部分に分割する
const left = BigInt(dataview.getUint32(byteOffset|0, !!littleEndian)>>>0);
const right = BigInt(dataview.getUint32((byteOffset|0) + 4|0, !!littleEndian)>>>0);
// 2つの32ビットの値を結合して返す
return littleEndian ? (right<<bigThirtyTwo)|left : (left<<bigThirtyTwo)|right;
}
プロパティ
すべての DataView インスタンスは、DataView.prototype から継承します。また、すべての DataView オブジェクトにプロパティを追加できます。
- DataView.prototype.constructor
- オブジェクトのプロトタイプを生成する関数を指定します。初期値は標準ビルトイン
DataViewコンストラクタです。 DataView.prototype.buffer読取専用- このビューによって参照される
ArrayBuffer。構築時に設定されます。読取専用 DataView.prototype.byteLength読取専用ArrayBufferの開始位置からこのビューの(バイト単位の)長さ。構築時に設定され、読取専用DataView.prototype.byteOffset読取専用ArrayBufferの開始位置からこのビューの(バイト単位の)オフセット。構築時に設定され、読取専用
メソッド
Read
DataView.prototype.getInt8()- ビューの開始位置から指定されたバイト単位のオフセットで符号付き8ビット整数値(byte)を取得します。
DataView.prototype.getUint8()- ビューの開始位置から指定されたバイト単位のオフセットで符号無し8ビット整数値(unsigned byte) を取得します。
DataView.prototype.getInt16()- ビューの開始位置から指定されたバイト単位のオフセットで符号付き16ビット整数値(short)を取得します。
DataView.prototype.getUint16()- ビューの開始位置からの指定されたバイト単位のオフセットで符号無し16ビット整数値(unsigned short)を取得します。
DataView.prototype.getInt32()- ビューの開始位置からの指定されたバイト単位のオフセットで符号あり32ビット整数値(long)を取得します。
DataView.prototype.getUint32()- ビューの開始位置からの指定されたバイト単位のオフセットで符号無し32ビット整数値(unsigned long)を取得します。
DataView.prototype.getFloat32()- ビューの開始位置からの指定されたバイト単位のオフセットで符号あり32ビット浮動小数点(float)を取得します。
DataView.prototype.getFloat64()- ビューの開始位置からの指定されたバイト単位のオフセットで符号あり64ビット浮動小数点(double)を取得します。
Write
DataView.prototype.setInt8()- ビューの開始位置からの指定されたバイト単位のオフセットで符号あり8ビット整数値(byte)を格納します。
DataView.prototype.setUint8()- ビューの開始位置からの指定されたバイト単位のオフセットで符号なし8ビット整数値(unsigned byte)を格納します。
DataView.prototype.setInt16()- ビューの開始位置からの指定されたバイト単位のオフセットで符号あり16ビット整数値(short)を格納します。
DataView.prototype.setUint16()- ビューの開始位置からの指定されたバイト単位のオフセットで符号無し16ビット整数値(unsigned short)を格納します。
DataView.prototype.setInt32()- ビューの開始位置からの指定されたバイト単位のオフセットで符号あり32ビット整数値(long)を格納します。
DataView.prototype.setUint32()- ビューの開始位置からの指定されたバイト単位のオフセットで符号無し32ビット整数値(unsigned long)を格納します。
DataView.prototype.setFloat32()- ビューの開始位置からの指定されたバイト単位のオフセットで符号あり32ビット浮動小数点(float)を格納します。
DataView.prototype.setFloat64()- ビューの開始位置からの指定されたバイト単位のオフセットで符号あり64ビット浮動小数点(double)を格納します。
例
var buffer = new ArrayBuffer(16); var view = new DataView(buffer, 0); view.setInt16(1, 42); view.getInt16(1); // 42
仕様書
| 仕様書 | 状態 | 備考 |
|---|---|---|
| ECMAScript (ECMA-262) DataView の定義 |
現行の標準 | |
| ECMAScript 2015 (6th Edition, ECMA-262) DataView の定義 |
標準 | ECMA 標準における初回定義 |
| Typed Array Specification | 廃止された | ECMAScript 6 で置き換え |
ブラウザーの互換性
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DataView | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
DataView() constructor | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
buffer | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
byteLength | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
byteOffset | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
getBigInt64 | Chrome 完全対応 67 | Edge 完全対応 79 | Firefox 完全対応 68 | IE 未対応 なし | Opera 完全対応 54 | Safari 未対応 なし | WebView Android 完全対応 67 | Chrome Android 完全対応 67 | Firefox Android 完全対応 68 | Opera Android 完全対応 48 | Safari iOS 未対応 なし | Samsung Internet Android 完全対応 9.0 | nodejs 完全対応 10.4.0 |
getBigUint64 | Chrome 完全対応 67 | Edge 完全対応 79 | Firefox 完全対応 68 | IE 未対応 なし | Opera 完全対応 54 | Safari 未対応 なし | WebView Android 完全対応 67 | Chrome Android 完全対応 67 | Firefox Android 完全対応 68 | Opera Android 完全対応 48 | Safari iOS 未対応 なし | Samsung Internet Android 完全対応 9.0 | nodejs 完全対応 10.4.0 |
getFloat32 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
getFloat64 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
getInt16 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
getInt32 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
getInt8 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
getUint16 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
getUint32 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
getUint8 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
setBigInt64 | Chrome 完全対応 67 | Edge 完全対応 79 | Firefox 完全対応 68 | IE 未対応 なし | Opera 完全対応 54 | Safari 未対応 なし | WebView Android 完全対応 67 | Chrome Android 完全対応 67 | Firefox Android 完全対応 68 | Opera Android 完全対応 48 | Safari iOS 未対応 なし | Samsung Internet Android 完全対応 9.0 | nodejs 完全対応 10.4.0 |
setBigUint64 | Chrome 完全対応 67 | Edge 完全対応 79 | Firefox 完全対応 68 | IE 未対応 なし | Opera 完全対応 54 | Safari 未対応 なし | WebView Android 完全対応 67 | Chrome Android 完全対応 67 | Firefox Android 完全対応 68 | Opera Android 完全対応 48 | Safari iOS 未対応 なし | Samsung Internet Android 完全対応 9.0 | nodejs 完全対応 10.4.0 |
setFloat32 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
setFloat64 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
setInt16 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
setInt32 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
setInt8 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
setUint16 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
setUint32 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
setUint8 | Chrome 完全対応 9 | Edge 完全対応 12 | Firefox 完全対応 15 | IE 完全対応 10 | Opera 完全対応 12.1 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 15 | Opera Android 完全対応 12.1 | Safari iOS 完全対応 4.2 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 0.10 |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
互換性のメモ
Firefox 40 より、 DataView は new 演算子を使用して生成しなければなりません。 new を伴わずに DataView() を関数として呼び出すと、 TypeError が発生するようになりました。
var view = DataView(buffer, 0); // TypeError: calling a builtin DataView constructor without new is forbidden
var view = new DataView(buffer, 0);
関連情報
- jDataView:
DataViewAPI をすべてのブラウザーや Node.js に展開するポリフィルの JavaScript ライブラリー ArrayBufferSharedArrayBuffer