DataView

DataView provê uma interface de baixo nível para leitura e escrita de múltiplos tipos de número em um ArrayBuffer, independentemente da extremidade (endianness) da plataforma.

Sintaxe

new DataView(buffer [, byteOffset [, byteLength]])

Parâmetros

buffer
ArrayBuffer ou SharedArrayBuffer existente para usar como armazenamento de um novo objeto DataView.
byteOffset Optional
A mudança, em bytes, do primeiro byte determinado em um buffer, que será referenciado pela nova view. Se não for especificado, a view do buffer começará no primeiro byte.
byteLength Optional
O número de elementos no array de bytes. Se não especificado, o tamanho da view será do mesmo tamanho do buffer.

Retorno

Um novo objeto DataView que representa o buffer de dados especificado. (Provavelmente não foi uma descrição muito útil.)

Você pode pensar nesse objeto retornado como um "intérprete" de um array buffer de bytes - ele sabe como converter números para inserir em um buffer corretamente, tanto ao ler quanto ao gravar. Isso significa lidar com conversões integer, float, endianness e outros detalhes da representação de números em formato binário.

Exceções

RangeError
Lançado se o byteOffset ou byteLength especificados ultrapassarem o final do buffer.
Por exemplo, se o buffer tem 16 bytes de comprimento, o byteOffset é 8 e o byteLength é 10, esse erro será lançado porque a view resultante tenta estender 2 bytes acima do comprimento total do buffer.

Descrição

Endianness

Formatos de números Multi-byte são representados de maneira diferente na memória, dependendo da arquitetura da máquina, veja Endianness para mais informações. Assessores de DataView fornecem controle explícito de como o dado será acessado, independente do endianness da arquitetura em execução. 

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

Valores inteiros de 64 bits

Como JavaScript atualmente não inclui suporte padrão para valores inteiros de 64 bits, DataView não oferece operações nativas de 64 bits. Como solução alternativa, você poderia implementar sua própria função getUint64() para obter um valor com a precisão de Number.MAX_SAFE_INTEGER, o que pode ser bom para determinados casos.

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;
}

Como alternativa, se você precisar de um intervalo completo de 64 bits, poderá criar um BigInt.

function getUint64BigInt(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 as their hex string representations
  const combined = littleEndian ?
    right.toString(16) + left.toString(16).padStart(8, '0') :
    left.toString(16) + right.toString(16).padStart(8, '0');

  return BigInt(`0x${combined}`);
}

Propriedades

Todas as instâncias de DataView herdam DataView.prototype e permitem a adição de propriedades a todos os objetos DataView.

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.

Métodos

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.

Exemplo

var buffer = new ArrayBuffer(16);
var dv = new DataView(buffer, 0);

dv.setInt16(1, 42);
dv.getInt16(1); //42

Especificações

Especificação Status Comentário
Typed Array Specification Obsoleto Substituído pelo ECMAScript 6
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'DataView' in that specification.
Padrão Definição inicial no ECMA standard
ECMAScript Latest Draft (ECMA-262)
The definition of 'DataView' in that specification.
Rascunho  

Compatibilidade entre navegadores

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
DataViewChrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
bufferChrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
byteLengthChrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
byteOffsetChrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
getBigInt64Chrome Full support 67Edge No support NoFirefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
getBigUint64Chrome Full support 67Edge No support NoFirefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
getFloat32Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
getFloat64Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
getInt16Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
getInt32Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
getInt8Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
getUint16Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
getUint32Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
getUint8Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
DataView() without new throwsChrome Full support 11Edge Full support 13Firefox Full support 40IE No support NoOpera Full support YesSafari ? WebView Android Full support ≤37Chrome Android Full support 18Firefox Android Full support 40Opera Android Full support YesSafari iOS ? Samsung Internet Android Full support 1.0nodejs Full support 0.12
prototypeChrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
setBigInt64Chrome Full support 67Edge No support NoFirefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
setBigUint64Chrome Full support 67Edge No support NoFirefox Full support 68IE No support NoOpera Full support 54Safari No support NoWebView Android Full support 67Chrome Android Full support 67Firefox Android Full support 68Opera Android Full support 48Safari iOS No support NoSamsung Internet Android Full support 9.0nodejs Full support 10.4.0
setFloat32Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
setFloat64Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
setInt16Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
setInt32Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
setInt8Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
setUint16Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
setUint32Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
setUint8Chrome Full support 9Edge Full support 12Firefox Full support 15IE Full support 10Opera Full support 12.1Safari Full support 5.1WebView Android Full support 4Chrome Android Full support 18Firefox Android Full support 15Opera Android Full support 12.1Safari iOS Full support 4.2Samsung Internet Android Full support Yesnodejs Full support Yes
SharedArrayBuffer accepted as bufferChrome Full support 60Edge No support NoFirefox Full support 55IE No support NoOpera Full support 47Safari ? WebView Android Full support 60Chrome Android Full support 60Firefox Android Full support 55Opera Android ? Safari iOS ? Samsung Internet Android Full support 8.0nodejs ?

Legend

Full support  
Full support
No support  
No support
Compatibility unknown  
Compatibility unknown

Notas de compatibilidade

Começando com o Firefox 40, DataView deve ser construído com o operador new . Chamando DataView() como uma função sem o new,  irá lançar um TypeError de agora em diante.

var dv = DataView(buffer, 0); 
// TypeError: calling a builtin DataView constructor without new is forbidden
var dv = new DataView(buffer, 0);

Veja também