DataView

DataView ビューは ArrayBuffer の多様な数値型を、プラットフォームのエンディアンに関係なく読み書きするための低水準インターフェイスを提供します。

構文

new DataView(buffer [, byteOffset [, byteLength]])

引数

buffer
新たな DataView オブジェクトのための記憶領域として用いる、既存の ArrayBuffer または SharedArrayBuffer です。
byteOffset Optional
指定されたバッファーで、新たなビューが参照する最初のバイト位置を示すオフセットを、バイト単位で示します。省略した場合、バッファーのビューは最初のバイト位置から参照し始めます。
byteLength Optional
バイト配列内の要素数です。省略した場合、ビューの長さはバッファーの長さと同じになります。

返値

指定されたデータバッファーを表す、新たな 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 Latest Draft (ECMA-262)
DataView の定義
ドラフト
ECMAScript 2015 (6th Edition, ECMA-262)
DataView の定義
標準 ECMA 標準における初回定義
Typed Array Specification 廃止された ECMAScript 6 で置き換え

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
DataViewChrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
bufferChrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
byteLengthChrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
byteOffsetChrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
getBigInt64Chrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 完全対応 9.0nodejs 完全対応 10.4.0
getBigUint64Chrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 完全対応 9.0nodejs 完全対応 10.4.0
getFloat32Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
getFloat64Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
getInt16Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
getInt32Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
getInt8Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
getUint16Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
getUint32Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
getUint8Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
DataView() without new throwsChrome 完全対応 11Edge 完全対応 13Firefox 完全対応 40IE 未対応 なしOpera 完全対応 ありSafari ? WebView Android 完全対応 ≤37Chrome Android 完全対応 18Firefox Android 完全対応 40Opera Android 完全対応 ありSafari iOS ? Samsung Internet Android 完全対応 1.0nodejs 完全対応 0.12
prototypeChrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
setBigInt64Chrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 完全対応 9.0nodejs 完全対応 10.4.0
setBigUint64Chrome 完全対応 67Edge 未対応 なしFirefox 完全対応 68IE 未対応 なしOpera 完全対応 54Safari 未対応 なしWebView Android 完全対応 67Chrome Android 完全対応 67Firefox Android 完全対応 68Opera Android 完全対応 48Safari iOS 未対応 なしSamsung Internet Android 完全対応 9.0nodejs 完全対応 10.4.0
setFloat32Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
setFloat64Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
setInt16Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
setInt32Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
setInt8Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
setUint16Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
setUint32Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
setUint8Chrome 完全対応 9Edge 完全対応 12Firefox 完全対応 15IE 完全対応 10Opera 完全対応 12.1Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 15Opera Android 完全対応 12.1Safari iOS 完全対応 4.2Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
SharedArrayBuffer accepted as bufferChrome 完全対応 60Edge 未対応 なしFirefox 完全対応 55IE 未対応 なしOpera 完全対応 47Safari ? WebView Android 完全対応 60Chrome Android 完全対応 60Firefox Android 完全対応 55Opera Android ? Safari iOS ? Samsung Internet Android 完全対応 8.0nodejs ?

凡例

完全対応  
完全対応
未対応  
未対応
実装状況不明  
実装状況不明

互換性のメモ

Firefox 40 より、 DataViewnew 演算子を使用して生成しなければなりません。 new を伴わずに DataView() を関数として呼び出すと、 TypeError が発生するようになりました。

var view = DataView(buffer, 0); 
// TypeError: calling a builtin DataView constructor without new is forbidden
var view = new DataView(buffer, 0);

関連情報