TypedArray in JavaScript
Questo articolo spiega i TypedArray
in JavaScript.
Spiegheremo in dettaglio il concetto base di TypedArray
, ogni tipo, come usarli e casi d'uso specifici.
YouTube Video
TypedArray in JavaScript
Un TypedArray
in JavaScript è un oggetto per gestire in modo efficiente i dati binari memorizzati in buffer. Il TypedArray
alloca e manipola la memoria in base a tipi specifici di dati. A differenza degli array normali, un TypedArray
può contenere solo dati binari a dimensione fissa, non tipi di dati arbitrari.
La Struttura di Base di un TypedArray
I principali componenti di un TypedArray
sono l'ArrayBuffer
e il TypedArray
stesso.
- ArrayBuffer: Un buffer a dimensione fissa che alloca dati binari in memoria. Questo buffer è semplicemente un'area dati e non può essere letto o scritto direttamente.
- TypedArray: Un oggetto wrapper che applica un tipo di dato specifico al buffer, consentendo l'accesso e la manipolazione dei dati.
Esempio base di utilizzo
Di seguito è riportato un esempio di creazione di un ArrayBuffer
e successivamente di un TypedArray
basato su di esso.
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
- In questo esempio, viene creato un
ArrayBuffer
, e poi unUint8Array
viene basato su quel buffer. Ogni elemento è trattato come un intero senza segno a 8 bit, memorizzando valori solo entro l'intervallo specificato.
Tipi di TypedArray
Ci sono diversi tipi di TypedArray
per ciascun tipo di dato. I principali sono i seguenti.
Nome Tipo | Dimensione dell'Elemento | Descrizione |
---|---|---|
Int8Array |
1 byte | Intero con segno a 8-bit |
Uint8Array |
1 byte | Intero senza segno a 8-bit |
Uint8ClampedArray |
1 byte | Intero senza segno a 8-bit (valori limitati) |
Int16Array |
2 byte | Intero con segno a 16-bit |
Uint16Array |
2 byte | Intero senza segno a 16-bit |
Int32Array |
4 byte | Intero con segno a 32-bit |
Uint32Array |
4 byte | Intero senza segno a 32-bit |
Float32Array |
4 byte | Numero in virgola mobile a 32-bit |
Float64Array |
8 byte | Numero in virgola mobile a 64-bit |
Questi TypedArray
sono tutti efficienti in termini di memoria ed efficaci per gestire grandi quantità di dati.
Manipolazione dei TypedArray
È possibile accedere ai dati in un TypedArray
utilizzando gli indici, proprio come in un array normale, ma sono anche forniti diversi metodi speciali.
Impostazione dei valori
In un TypedArray
, è possibile assegnare più valori contemporaneamente utilizzando il metodo 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
- Questo codice utilizza il metodo
set
per assegnare più valori contemporaneamente a unInt16Array
e visualizza ogni elemento nella console.
Ottenere un sottoarray
Per ottenere una parte di un TypedArray
come sottoarray, utilizza il metodo subarray
. Questo fa riferimento allo stesso buffer del TypedArray
originale.
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]
- Questo codice recupera un intervallo specifico di elementi da un
Int16Array
usando il metodosubarray
e visualizza il sottoarray nella console.
Copia dei buffer
Il buffer di un TypedArray
può essere copiato anche in un altro TypedArray
. Utilizzando il metodo set
, è possibile copiare da una posizione specificata.
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]
- Questo codice copia il contenuto di un
Uint8Array
in un altro array utilizzando il metodoset
e visualizza l'array copiato nella console.
Uso di DataView
Mentre un TypedArray
gestisce buffer con un tipo di dato fisso, DataView
è un'interfaccia che consente la manipolazione flessibile di dati binari con offset e tipi di dati arbitrari. Questo consente di mescolare diversi tipi di dati all'interno dello stesso 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
-
Questo codice utilizza un
DataView
per scrivere diversi tipi di dati—interi a 32 bit e numeri in virgola mobile a 32 bit—sullo stesso buffer e verifica i risultati. -
DataView
offre una maggiore flessibilità di accesso ai dati rispetto aTypedArray
ed è particolarmente utile quando si lavora con file in formato binario o protocolli di rete.
Casi d'uso dei TypedArray
TypedArray
è utilizzato principalmente per gestire in modo efficiente grandi quantità di dati binari. I seguenti sono alcuni casi d'uso specifici.
Elaborazione delle immagini
TypedArray
viene utilizzato per manipolare le informazioni sui pixel dei dati di immagine. Utilizzando Uint8Array
, si mantengono i valori RGBA di ogni pixel e si eseguono modifiche ed elaborazioni delle immagini.
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}
- Questo codice crea dati immagine con una larghezza di 100 e un'altezza di 100 in formato RGBA utilizzando un
Uint8Array
e imposta tutti i pixel su rosso.
Interfacciarsi con WebAssembly
TypedArray
viene utilizzato per scambiare dati binari tra JavaScript e WebAssembly. Condividendo lo spazio di memoria di JavaScript e WebAssembly tramite ArrayBuffer
, è possibile uno scambio rapido di dati.
Elaborazione di dati audio e video
TypedArray
svolge un ruolo importante nell'elaborazione di audio e video. È possibile memorizzare le forme d'onda dei dati audio in un Float32Array
per eseguire la riproduzione e l'elaborazione.
Conclusione
TypedArray
è uno strumento potente per gestire in modo efficiente grandi quantità di dati binari. È particolarmente utile in applicazioni critiche per le prestazioni come l'elaborazione di immagini, WebAssembly e l'elaborazione di dati audio/video. TypedArray
ha un'API simile a quella degli array regolari, ma ci sono vincoli riguardo all'uso della memoria e ai tipi di dati, quindi è necessaria una differenziazione corretta nell'uso.
Puoi seguire l'articolo sopra utilizzando Visual Studio Code sul nostro canale YouTube. Controlla anche il nostro canale YouTube.