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.
new DataView(buffer [, byteOffset [, byteLength]])
buffer
ArrayBuffer
or SharedArrayBuffer
to use as the storage backing the new DataView
object.byteOffset
Optional
byteLength
Optional
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.
RangeError
Thrown if the byteOffset
or byteLength
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 the byteLength
is 10, this error is thrown because the resulting view tries to extend 2 bytes past the total length of the buffer.
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() method to obtain a value with precision up to Number.MAX_SAFE_INTEGER
, which could suffice for certain cases.
DataView.prototype.getUint64 = function(byteOffset, littleEndian) { // split 64-bit number into two 32-bit (4-byte) parts const left = this.getUint32(byteOffset, littleEndian); const right = this.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; }
All DataView
instances inherit from DataView.prototype
and allows the addition of properties to all DataView objects.
DataView.prototype.constructor
DataView
constructor.DataView.prototype.buffer
Read only
ArrayBuffer
referenced by this view. Fixed at construction time and thus read only.
DataView.prototype.byteLength
Read only
ArrayBuffer
. Fixed at construction time and thus read only.
DataView.prototype.byteOffset
Read only
ArrayBuffer
. Fixed at construction time and thus read only.
DataView.prototype.getInt8()
DataView.prototype.getUint8()
DataView.prototype.getInt16()
DataView.prototype.getUint16()
DataView.prototype.getInt32()
DataView.prototype.getUint32()
DataView.prototype.getFloat32()
DataView.prototype.getFloat64()
DataView.prototype.setInt8()
DataView.prototype.setUint8()
DataView.prototype.setInt16()
DataView.prototype.setUint16()
DataView.prototype.setInt32()
DataView.prototype.setUint32()
DataView.prototype.setFloat32()
DataView.prototype.setFloat64()
var buffer = new ArrayBuffer(16); var view = new DataView(buffer, 0); view.setInt16(1, 42); view.getInt16(1); // 42
Specification | Status | Comment |
---|---|---|
Typed Array Specification | Obsolete | Superseded by ECMAScript 6 |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'DataView' in that specification. | Standard | Initial definition in an ECMA standard |
ECMAScript Latest Draft (ECMA-262) The definition of 'DataView' in that specification. | Draft |
Desktop | ||||||
---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | |
Basic support | 9 | 12 | 15 | 10 | 12.1 | 5.1 |
DataView() without new throws |
Yes | Yes | 40 | No | Yes | ? |
SharedArrayBuffer accepted as buffer |
60 | ? | 55 | ? | ? | ? |
buffer |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
byteLength |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
byteOffset |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
getFloat32 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
getFloat64 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
getInt16 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
getInt32 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
getInt8 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
getUint16 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
getUint32 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
getUint8 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
setFloat32 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
setFloat64 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
setInt16 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
setInt32 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
setInt8 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
setUint16 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
setUint32 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
setUint8 |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
prototype |
9 | 12 | 15 | 10 | 12.1 | 5.1 |
Mobile | |||||||
---|---|---|---|---|---|---|---|
Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | iOS Safari | Samsung Internet | |
Basic support | 4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
DataView() without new throws |
? | ? | ? | 40 | ? | ? | ? |
SharedArrayBuffer accepted as buffer |
? | ? | ? | 55 | ? | ? | ? |
buffer |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
byteLength |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
byteOffset |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
getFloat32 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
getFloat64 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
getInt16 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
getInt32 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
getInt8 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
getUint16 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
getUint32 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
getUint8 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
setFloat32 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
setFloat64 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
setInt16 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
setInt32 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
setInt8 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
setUint16 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
setUint32 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
setUint8 |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
prototype |
4 | Yes | Yes | 15 | 12 | 4.2 | Yes |
Server | |
---|---|
Node.js | |
Basic support | Yes |
DataView() without new throws |
0.12 |
SharedArrayBuffer accepted as buffer |
? |
buffer |
Yes |
byteLength |
Yes |
byteOffset |
Yes |
getFloat32 |
Yes |
getFloat64 |
Yes |
getInt16 |
Yes |
getInt32 |
Yes |
getInt8 |
Yes |
getUint16 |
Yes |
getUint32 |
Yes |
getUint8 |
Yes |
setFloat32 |
Yes |
setFloat64 |
Yes |
setInt16 |
Yes |
setInt32 |
Yes |
setInt8 |
Yes |
setUint16 |
Yes |
setUint32 |
Yes |
setUint8 |
Yes |
prototype |
Yes |
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);
DataView
API to all browsers and Node.js.ArrayBuffer
SharedArrayBuffer
© 2005–2018 Mozilla Developer Network and individual 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