TypedArray em JavaScript
Este artigo explica o TypedArray
em JavaScript.
Explicaremos em detalhes o conceito básico de TypedArray
, cada tipo, como usá-los e casos de uso específicos.
YouTube Video
TypedArray em JavaScript
TypedArray
em JavaScript é um objeto para manipulação eficiente de dados binários em buffer. TypedArray
aloca e manipula memória com base em tipos de dados específicos. Ao contrário de arrays regulares, o TypedArray
pode conter apenas dados binários de tamanho fixo, não tipos de dados arbitrários.
A Estrutura Básica do TypedArray
Os principais componentes de um TypedArray
são o ArrayBuffer
e o próprio TypedArray
.
- ArrayBuffer: Um buffer de tamanho fixo que aloca dados binários na memória. Este buffer é apenas uma área de dados e não pode ser lido ou escrito diretamente.
- TypedArray: Um objeto wrapper que aplica um tipo de dado específico ao buffer, permitindo acesso e manipulação de dados.
Exemplo Básico de Uso
A seguir, está um exemplo de criação de um ArrayBuffer
e, em seguida, a criação de um TypedArray
com base nele.
1// Create a 16-byte buffer
2const buffer = new ArrayBuffer(16);
3
4// Create a TypedArray (Uint8Array) to handle 8-bit unsigned integers
5const uint8Array = new Uint8Array(buffer);
6
7// Set data
8uint8Array[0] = 255;
9uint8Array[1] = 128;
10
11// Retrieve data
12console.log(uint8Array[0]); // 255
13console.log(uint8Array[1]); // 128
- Neste exemplo, um
ArrayBuffer
é criado e, em seguida, umUint8Array
é feito com base nesse buffer. Cada elemento é tratado como um inteiro sem sinal de 8 bits, armazenando valores apenas dentro do intervalo especificado.
Tipos de TypedArray
Existem diferentes tipos de TypedArray
para cada tipo de dado. Os principais são os seguintes.
Nome do Tipo | Tamanho do Elemento | Descrição |
---|---|---|
Int8Array |
1 byte | Inteiro assinado de 8 bits |
Uint8Array |
1 byte | Inteiro não assinado de 8 bits |
Uint8ClampedArray |
1 byte | Inteiro não assinado de 8 bits (mantém valores limitados) |
Int16Array |
2 bytes | Inteiro assinado de 16 bits |
Uint16Array |
2 bytes | Inteiro não assinado de 16 bits |
Int32Array |
4 bytes | Inteiro assinado de 32 bits |
Uint32Array |
4 bytes | Inteiro não assinado de 32 bits |
Float32Array |
4 bytes | Número de ponto flutuante de 32 bits |
Float64Array |
8 bytes | Número de ponto flutuante de 64 bits |
Esses TypedArray
s são todos eficientes em termos de memória e eficazes para lidar com grandes volumes de dados.
Manipulação de TypedArrays
Você pode acessar dados em um TypedArray
usando índices, assim como em um array comum, mas também são fornecidos vários métodos especiais.
Definindo valores
Em um TypedArray
, você pode atribuir vários valores de uma vez usando o método set
.
1const buffer = new ArrayBuffer(8);
2const int16Array = new Int16Array(buffer);
3
4// Set values
5int16Array.set([10, 20, 30]);
6
7console.log(int16Array[0]); // 10
8console.log(int16Array[1]); // 20
9console.log(int16Array[2]); // 30
- Este código usa o método
set
para atribuir vários valores de uma vez a umInt16Array
e exibe cada elemento no console.
Obtendo um subarray
Para obter uma parte de um TypedArray
como um subarray, use o método subarray
. Isso referencia o mesmo buffer do TypedArray
original.
1const int16Array = new Int16Array([1, 2, 3, 4, 5]);
2
3// Get a subarray containing elements from the 2nd to the 4th
4const subArray = int16Array.subarray(1, 4);
5
6console.log(subArray); // Int16Array [2, 3, 4]
- Este código recupera um intervalo especificado de elementos de um
Int16Array
usando o métodosubarray
e exibe o subarray no console.
Copiando buffers
O buffer de um TypedArray
também pode ser copiado para outro TypedArray
. Usando o método set
, você pode copiar a partir de uma posição especificada.
1const srcArray = new Uint8Array([10, 20, 30, 40]);
2const destArray = new Uint8Array(4);
3
4// Copy
5destArray.set(srcArray);
6
7console.log(destArray); // Uint8Array [10, 20, 30, 40]
- Este código copia o conteúdo de um
Uint8Array
para outro array usando o métodoset
e exibe o array copiado no console.
Usando DataView
Enquanto um TypedArray
lida com buffers de tipo de dado fixo, DataView
é uma interface que permite a manipulação flexível de dados binários com deslocamentos arbitrários e tipos de dados variados. Isso permite que diferentes tipos sejam misturados dentro do mesmo buffer.
1const buffer = new ArrayBuffer(8);
2const dataView = new DataView(buffer);
3
4// Write a 32-bit signed integer at offset 0
5dataView.setInt32(0, 12345);
6
7// Write a 32-bit floating-point number at offset 4
8dataView.setFloat32(4, 12.34);
9
10console.log(dataView.getInt32(0)); // 12345
11console.log(dataView.getFloat32(4)); // 12.34000015258789
-
Este código usa um
DataView
para gravar diferentes tipos de dados—inteiros de 32 bits e números de ponto flutuante de 32 bits—no mesmo buffer e verifica os resultados. -
DataView
oferece maior flexibilidade no acesso aos dados do queTypedArray
e é especialmente útil ao trabalhar com arquivos em formato binário ou protocolos de rede.
Casos de uso de TypedArray
TypedArray
é usado principalmente para lidar eficientemente com grandes quantidades de dados binários. Casos de uso específicos incluem o seguinte.
Processamento de imagem
TypedArray
é usado ao manipular informações de pixel em dados de imagem. Usando Uint8Array
, você mantém os valores RGBA de cada pixel e realiza edição e processamento de imagem.
1const width = 100;
2const height = 100;
3const imageData = new Uint8Array(width * height * 4); // RGBA
4
5// Set pixel data
6for (let i = 0; i < imageData.length; i += 4) {
7 imageData[i] = 255; // Red
8 imageData[i + 1] = 0; // Green
9 imageData[i + 2] = 0; // Blue
10 imageData[i + 3] = 255; // Alpha
11}
- Este código cria dados de imagem com largura de 100 e altura de 100 no formato RGBA usando um
Uint8Array
e define todos os pixels como vermelhos.
Interagindo com WebAssembly
TypedArray
é utilizado para a troca de dados binários entre JavaScript e WebAssembly. Ao compartilhar o espaço de memória do JavaScript e WebAssembly através de ArrayBuffer
, é possível realizar uma troca rápida de dados.
Processamento de dados de áudio e vídeo
TypedArray
desempenha um papel importante no processamento de áudio e vídeo. Você pode armazenar formas de onda de dados de áudio em Float32Array
para realizar reprodução e processamento.
Conclusão
TypedArray
é uma ferramenta poderosa para lidar eficientemente com grandes quantidades de dados binários. É particularmente útil em aplicações críticas para desempenho, como processamento de imagens, WebAssembly e processamento de dados de áudio/vídeo. TypedArray
possui uma API semelhante à de arrays comuns, mas há restrições quanto ao uso de memória e tipos de dados, então é necessário diferenciar o uso de forma adequada.
Você pode acompanhar o artigo acima usando o Visual Studio Code em nosso canal do YouTube. Por favor, confira também o canal do YouTube.