// Create an ArrayBuffer with a size in bytes
const buffer = new ArrayBuffer(16);
// Create a couple of views
const view1 = new DataView(buffer);
const view2 = new DataView(buffer, 12, 4); // From byte 12 for the next 4 bytes
view1.setInt8(12, 42); // Put 42 in slot 12
console.log(view2.getInt8(0));
// Expected output: 42
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.
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.
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.
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.
js
var littleEndian =(function(){var buffer =newArrayBuffer(2);newDataView(buffer).setInt16(0,256,true/* littleEndian */);// Int16Array uses the platform's endianness.returnnewInt16Array(buffer)[0]===256;})();
console.log(littleEndian);// true or false
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.
js
functiongetUint64(dataview, byteOffset, littleEndian){// split 64-bit number into two 32-bit (4-byte) partsconst left = dataview.getUint32(byteOffset, littleEndian);const right = dataview.getUint32(byteOffset +4, littleEndian);// combine the two 32-bit valuesconst 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.
js
functiongetUint64BigInt(dataview, byteOffset, littleEndian){// split 64-bit number into two 32-bit (4-byte) partsconst left = dataview.getUint32(byteOffset, littleEndian);const right = dataview.getUint32(byteOffset +4, littleEndian);// combine the two 32-bit values as their hex string representationsconst combined = littleEndian
? right.toString(16)+ left.toString(16).padStart(8,"0"): left.toString(16)+ right.toString(16).padStart(8,"0");returnBigInt(`0x${combined}`);}
Tip: you can click/tap on a cell for more information.
Full support
Full support
No support
No support
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
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.
js
var dv =DataView(buffer,0);// TypeError: calling a builtin DataView constructor without new is forbidden