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
.
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
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
ArrayBuffer
. Fixed at construction time and thus
read only.
DataView.prototype.byteOffset
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.
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. |
| 桌面 | 移动 | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
完整支持
不支持
DataView
API to all browsers and Node.js.
ArrayBuffer
SharedArrayBuffer
DataView
DataView.prototype.getBigInt64()
DataView.prototype.getBigUint64()
DataView.prototype.getFloat32()
DataView.prototype.getFloat64()
DataView.prototype.getInt16()
DataView.prototype.getInt32()
DataView.prototype.getInt8()
DataView.prototype.getUint16()
DataView.prototype.getUint32()
DataView.prototype.getUint8()
DataView.prototype.setBigInt64()
DataView.prototype.setBigUint64()
DataView.prototype.setFloat32()
DataView.prototype.setFloat64()
DataView.prototype.setInt16()
DataView.prototype.setInt32()
DataView.prototype.setInt8()
DataView.prototype.setUint16()
DataView.prototype.setUint32()
DataView.prototype.setUint8()
函数
对象
Object.prototype.__defineGetter__()
Object.prototype.__defineSetter__()
Object.prototype.__lookupGetter__()
Object.prototype.__lookupSetter__()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toSource()
Object.prototype.toString()
Object.prototype.valueOf()
Object.setPrototypeOf()