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 source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
new DataView(buffer [, byteOffset [, byteLength]])
Parameters
buffer
- An existing
ArrayBuffer
orSharedArrayBuffer
to use as the storage backing the newDataView
object. byteOffset
Optional- The offset, in bytes, to the first byte in the above buffer for the new view to reference. If unspecified, the buffer view starts with the first byte.
byteLength
Optional- The number of elements in the byte array. If unspecified, the view's length will match the buffer's length.
Return value
A new DataView
object representing the specified data buffer. (That probably wasn't a very helpful description.)
You can think of the returned object as an "interpreter" of the array buffer of bytes — it knows how to convert numbers to fit within the buffer correctly, both when reading and writing to it. This means handling integer and float conversion, endianness, and other details of representing numbers in binary form.
Exceptions
RangeError
-
Thrown if the
byteOffset
orbyteLength
parameter values result in the view extending past the end of the buffer.For example, if the buffer is 16 bytes long, the
byteOffset
is 8, and thebyteLength
is 10, this error is thrown because the resulting view tries to extend 2 bytes past the total length of the buffer.
Description
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; }
Properties
All DataView
instances inherit from DataView.prototype
and allows the addition of properties to all DataView objects.
DataView.prototype.constructor
- Specifies the function that creates an object's prototype. The initial value is the standard built-in
DataView
constructor. DataView.prototype.buffer
Read only- The
ArrayBuffer
referenced by this view. Fixed at construction time and thus read only. DataView.prototype.byteLength
Read only- The length (in bytes) of this view from the start of its
ArrayBuffer
. Fixed at construction time and thus read only. DataView.prototype.byteOffset
Read only- The offset (in bytes) of this view from the start of its
ArrayBuffer
. Fixed at construction time and thus read only.
Methods
Read
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.
Write
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.
Example
var buffer = new ArrayBuffer(16); var view = new DataView(buffer, 0); view.setInt16(1, 42); view.getInt16(1); // 42
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript Latest Draft (ECMA-262) The definition of 'DataView' in that specification. |
Draft | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'DataView' in that specification. |
Standard | Initial definition in an ECMA standard |
Typed Array Specification | Obsolete | Superseded by ECMAScript 6 |
Browser compatibility
Desktop | Mobile | Server | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DataView | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
buffer | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
byteLength | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
byteOffset | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
getBigInt64 | Chrome Full support 67 | Edge No support No | Firefox Full support 68 | IE No support No | Opera Full support 54 | Safari No support No | WebView Android Full support 67 | Chrome Android Full support 67 | Firefox Android Full support 68 | Opera Android Full support 48 | Safari iOS No support No | Samsung Internet Android Full support 9.0 | nodejs Full support 10.4.0 |
getBigUint64 | Chrome Full support 67 | Edge No support No | Firefox Full support 68 | IE No support No | Opera Full support 54 | Safari No support No | WebView Android Full support 67 | Chrome Android Full support 67 | Firefox Android Full support 68 | Opera Android Full support 48 | Safari iOS No support No | Samsung Internet Android Full support 9.0 | nodejs Full support 10.4.0 |
getFloat32 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
getFloat64 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
getInt16 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
getInt32 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
getInt8 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
getUint16 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
getUint32 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
getUint8 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
DataView() without new throws | Chrome Full support 11 | Edge Full support 13 | Firefox Full support 40 | IE No support No | Opera Full support Yes | Safari ? | WebView Android Full support ≤37 | Chrome Android Full support 18 | Firefox Android Full support 40 | Opera Android Full support Yes | Safari iOS ? | Samsung Internet Android Full support 1.0 | nodejs Full support 0.12 |
prototype | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
setBigInt64 | Chrome Full support 67 | Edge No support No | Firefox Full support 68 | IE No support No | Opera Full support 54 | Safari No support No | WebView Android Full support 67 | Chrome Android Full support 67 | Firefox Android Full support 68 | Opera Android Full support 48 | Safari iOS No support No | Samsung Internet Android Full support 9.0 | nodejs Full support 10.4.0 |
setBigUint64 | Chrome Full support 67 | Edge No support No | Firefox Full support 68 | IE No support No | Opera Full support 54 | Safari No support No | WebView Android Full support 67 | Chrome Android Full support 67 | Firefox Android Full support 68 | Opera Android Full support 48 | Safari iOS No support No | Samsung Internet Android Full support 9.0 | nodejs Full support 10.4.0 |
setFloat32 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
setFloat64 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
setInt16 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
setInt32 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
setInt8 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
setUint16 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
setUint32 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
setUint8 | Chrome Full support 9 | Edge Full support 12 | Firefox Full support 15 | IE Full support 10 | Opera Full support 12.1 | Safari Full support 5.1 | WebView Android Full support 4 | Chrome Android Full support 18 | Firefox Android Full support 15 | Opera Android Full support 12.1 | Safari iOS Full support 4.2 | Samsung Internet Android Full support Yes | nodejs Full support Yes |
SharedArrayBuffer accepted as buffer | Chrome Full support 60 | Edge No support No | Firefox Full support 55 | IE No support No | Opera Full support 47 | Safari ? | WebView Android Full support 60 | Chrome Android Full support 60 | Firefox Android Full support 55 | Opera Android ? | Safari iOS ? | Samsung Internet Android Full support 8.0 | nodejs ? |
Legend
- Full support
- Full support
- No support
- No support
- Compatibility unknown
- Compatibility unknown
Compatibility notes
Starting with Firefox 40, DataView
must be constructed with the new
operator. Calling DataView()
as a function without new
will throw a TypeError
.
var view = DataView(buffer, 0); // TypeError: calling a builtin DataView constructor without new is forbidden
var view = new DataView(buffer, 0);
See also
- jDataView: JavaScript library that polyfills and extends the
DataView
API to all browsers and Node.js. ArrayBuffer
SharedArrayBuffer