DataView

DataView view provides a low-level interface for reading and writing multiple number types in a binary ArrayBuffer , without having to care about the platform's endianness .

描述

Endianness

Multi-byte number formats are represented in memory differently depending on machine architecture — see Endianness for an explanation. DataView accessors provide explicit control of how data is accessed, regardless of the executing computer's endianness.

var littleEndian = (function() {
  var buffer = new ArrayBuffer(2);
  new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
  // Int16Array uses the platform's endianness.
  return new Int16Array(buffer)[0] === 256;
})();
console.log(littleEndian); // true or false
					

64-bit Integer Values

Because JavaScript does not currently include standard support for 64-bit integer values, DataView does not offer native 64-bit operations. As a workaround, you could implement your own getUint64() function to obtain a value with precision up to Number.MAX_SAFE_INTEGER , which could suffice for certain cases.

function getUint64(dataview, byteOffset, littleEndian) {
  // split 64-bit number into two 32-bit (4-byte) parts
  const left =  dataview.getUint32(byteOffset, littleEndian);
  const right = dataview.getUint32(byteOffset+4, littleEndian);
  // combine the two 32-bit values
  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;
}
					

Alternatively, if you need full 64-bit range, you can create a BigInt . Further, although native BigInts are much faster than user-land library equivalents, BigInts will always be much slower than 32-bit integers in JavaScript due to the nature of their variable size.

const BigInt = window.BigInt, bigThirtyTwo = BigInt(32), bigZero = BigInt(0);
function getUint64BigInt(dataview, byteOffset, littleEndian) {
  // split 64-bit number into two 32-bit (4-byte) parts
  const left = BigInt(dataview.getUint32(byteOffset|0, !!littleEndian)>>>0);
  const right = BigInt(dataview.getUint32((byteOffset|0) + 4|0, !!littleEndian)>>>0);
  // combine the two 32-bit values and return
  return littleEndian ? (right<<bigThirtyTwo)|left : (left<<bigThirtyTwo)|right;
}
					

构造函数

DataView()
创建新的 DataView 对象。

实例特性

DataView.prototype.buffer
ArrayBuffer referenced by this view. Fixed at construction time and thus read only.
DataView.prototype.byteLength
The length (in bytes) of this view from the start of its ArrayBuffer . Fixed at construction time and thus read only.
DataView.prototype.byteOffset
The offset (in bytes) of this view from the start of its ArrayBuffer . Fixed at construction time and thus read only.

实例方法

DataView.prototype.getInt8()
Gets a signed 8-bit integer (byte) at the specified byte offset from the start of the view.
DataView.prototype.getUint8()
Gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the view.
DataView.prototype.getInt16()
Gets a signed 16-bit integer (short) at the specified byte offset from the start of the view.
DataView.prototype.getUint16()
Gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the view.
DataView.prototype.getInt32()
Gets a signed 32-bit integer (long) at the specified byte offset from the start of the view.
DataView.prototype.getUint32()
Gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the view.
DataView.prototype.getFloat32()
Gets a signed 32-bit float (float) at the specified byte offset from the start of the view.
DataView.prototype.getFloat64()
Gets a signed 64-bit float (double) at the specified byte offset from the start of the view.
DataView.prototype.getBigInt64()
Gets a signed 64-bit integer (long long) at the specified byte offset from the start of the view.
DataView.prototype.getBigUint64()
Gets an unsigned 64-bit integer (unsigned long long) at the specified byte offset from the start of the view.
DataView.prototype.setInt8()
Stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the view.
DataView.prototype.setUint8()
Stores an unsigned 8-bit integer (unsigned byte) value at the specified byte offset from the start of the view.
DataView.prototype.setInt16()
Stores a signed 16-bit integer (short) value at the specified byte offset from the start of the view.
DataView.prototype.setUint16()
Stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the view.
DataView.prototype.setInt32()
Stores a signed 32-bit integer (long) value at the specified byte offset from the start of the view.
DataView.prototype.setUint32()
Stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the view.
DataView.prototype.setFloat32()
Stores a signed 32-bit float (float) value at the specified byte offset from the start of the view.
DataView.prototype.setFloat64()
Stores a signed 64-bit float (double) value at the specified byte offset from the start of the view.
DataView.prototype.setBigInt64()
Stores a signed 64-bit integer (long long) value at the specified byte offset from the start of the view.
DataView.prototype.setBigUint64()
Stores an unsigned 64-bit integer (unsigned long long) value at the specified byte offset from the start of the view.

范例

Using DataView

var buffer = new ArrayBuffer(16);
var view = new DataView(buffer, 0);
view.setInt16(1, 42);
view.getInt16(1); // 42
					

规范

规范
ECMAScript (ECMA-262)
The definition of 'DataView' in that specification.

浏览器兼容性

更新 GitHub 上的兼容性数据
Desktop Mobile Server
Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet Node.js
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() 构造函数 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 No Opera 54 Safari No WebView Android 67 Chrome Android 67 Firefox Android 68 Opera Android 48 Safari iOS No Samsung Internet Android 9.0 nodejs 10.4.0
getBigUint64 Chrome 67 Edge 79 Firefox 68 IE No Opera 54 Safari No WebView Android 67 Chrome Android 67 Firefox Android 68 Opera Android 48 Safari iOS No 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 No Opera 54 Safari No WebView Android 67 Chrome Android 67 Firefox Android 68 Opera Android 48 Safari iOS No Samsung Internet Android 9.0 nodejs 10.4.0
setBigUint64 Chrome 67 Edge 79 Firefox 68 IE No Opera 54 Safari No WebView Android 67 Chrome Android 67 Firefox Android 68 Opera Android 48 Safari iOS No 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

图例

完整支持
完整支持
不支持
不支持

另请参阅

Metadata