The 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.
The 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.
const littleEndian = (() => { const 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
Some browsers don't have support for DataView.prototype.setBigInt64()
and DataView.prototype.setBigUint64()
. So to enable 64-bit operations in your code that will work across browsers, you could implement your own getUint64()
function, to obtain values 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()
Creates a new DataView
object.
DataView.prototype.buffer
The 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.
const buffer = new ArrayBuffer(16); const view = new DataView(buffer, 0); view.setInt16(1, 42); view.getInt16(1); // 42
Specification |
---|
ECMAScript Language Specification # sec-dataview-objects |
Desktop | Mobile | Server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | Deno | Node.js | |
DataView |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
DataView |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
buffer |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
byteLength |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
byteOffset |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
getBigInt64 |
67 |
79 |
68 |
No |
54 |
15 |
67 |
67 |
68 |
48 |
15 |
9.0 |
1.0 |
10.4.0 |
getBigUint64 |
67 |
79 |
68 |
No |
54 |
15 |
67 |
67 |
68 |
48 |
15 |
9.0 |
1.0 |
10.4.0 |
getFloat32 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
getFloat64 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
getInt16 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
getInt32 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
getInt8 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
getUint16 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
getUint32 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
getUint8 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
setBigInt64 |
67 |
79 |
68 |
No |
54 |
15 |
67 |
67 |
68 |
48 |
15 |
9.0 |
1.0 |
10.4.0 |
setBigUint64 |
67 |
79 |
68 |
No |
54 |
15 |
67 |
67 |
68 |
48 |
15 |
9.0 |
1.0 |
10.4.0 |
setFloat32 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
setFloat64 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
setInt16 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
setInt32 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
setInt8 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
setUint16 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
setUint32 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
setUint8 |
9 |
12 |
15 |
10 |
12.1 |
5.1 |
4 |
18 |
15 |
12.1 |
5 |
1.0 |
1.0 |
0.10.0 |
DataView
in core-js
DataView
API to all browsers and Node.js.ArrayBuffer
SharedArrayBuffer
© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView