`ArrayBuffer` in JavaScript
Questo articolo spiega il ArrayBuffer
in JavaScript.
Spiegheremo tutto su ArrayBuffer
, dalle basi al suo utilizzo, ai tipi correlati e alle applicazioni pratiche.
YouTube Video
ArrayBuffer
in JavaScript
Il ArrayBuffer
di JavaScript è un oggetto per gestire dati binari a basso livello ed è particolarmente utile per manipolare dati binari in WebAPI, operazioni sui file e comunicazioni di rete.
Che cos'è il ArrayBuffer
ArrayBuffer
è una struttura dati per gestire dati binari a lunghezza fissa. Consente di gestire dati binari grezzi che non possono essere gestiti da array o oggetti JavaScript normali.
ArrayBuffer
non può manipolare direttamente i dati. Invece, i dati vengono letti e scritti utilizzando TypedArray
o DataView
basati su un ArrayBuffer
.
ArrayBuffer
è particolarmente utile nelle seguenti situazioni.
- Quando si processano dati binari ricevuti dalla rete
- Quando è necessaria una condivisione efficiente dei dati in
Web Worker
. - Quando si eseguono elaborazioni di immagini o rendering 3D con Canvas o WebGL.
- Quando si manipolano file (soprattutto file binari).
Creare un ArrayBuffer
Per prima cosa, vediamo come creare un'istanza di ArrayBuffer
. ArrayBuffer
alloca memoria in unità di byte, quindi è necessario specificarne la dimensione al momento della creazione.
1const buffer = new ArrayBuffer(16); // Create a 16-byte buffer
2console.log(buffer.byteLength); // 16
- In questo esempio, viene allocato un buffer di 16 byte. Questo buffer non contiene ancora alcun dato.
Manipolare i dati con TypedArray
Non è possibile accedere direttamente a un ArrayBuffer
, quindi si utilizza un TypedArray
per leggere e scrivere i dati. TypedArray
fornisce diversi tipi di viste come Int8Array
e Float32Array
, consentendo un accesso efficiente ai dati binari.
Esempio con Int8Array
1const buffer = new ArrayBuffer(8); // Create an 8-byte buffer
2const int8View = new Int8Array(buffer); // Create an Int8Array
3
4int8View[0] = 42; // Write data to the first byte
5console.log(int8View[0]); // 42
Int8Array
può memorizzare dati in ogni byte, consentendo al buffer di contenere 8 elementi. In questo modo, utilizzando diversi tipi di visualizzazioni, puoi manipolare i dati in modo efficiente.
Altri esempi di TypedArray
JavaScript ha vari tipi di TypedArray
. Ad esempio, se desideri gestire interi senza segno a 32 bit, utilizzi Uint32Array
.
1const buffer = new ArrayBuffer(16);
2const uint32View = new Uint32Array(buffer);
3
4uint32View[0] = 123456;
5console.log(uint32View[0]); // 123456
- Un
Uint32Array
può memorizzare dati in unità di 4 byte, quindi il buffer può contenere quattro elementi. È importante scegliere ilTypedArray
appropriato in base al tipo di dati che stai gestendo.
Manipolazione flessibile dei dati con DataView
TypedArray
può gestire solo dati di un tipo fisso, ma usando DataView
puoi scrivere dati di qualsiasi tipo in qualsiasi posizione. Questo è particolarmente utile quando si lavora con buffer che contengono tipi di dati misti.
1const buffer = new ArrayBuffer(16);
2const dataView = new DataView(buffer);
3
4// Write a 32-bit signed integer to byte 0
5dataView.setInt32(0, 2147483647);
6console.log(dataView.getInt32(0)); // 2147483647
7
8// Write a 16-bit unsigned integer to byte 4
9dataView.setUint16(4, 65535);
10console.log(dataView.getUint16(4)); // 65535
Utilizzando DataView
, puoi specificare un offset in byte e leggere o scrivere dati di vari tipi. Questo è molto utile quando si gestiscono strutture binarie complesse come protocolli di rete o formati di file.
Considerazioni sull'endianness
Quando utilizzi DataView
, devi anche prestare attenzione all'endianness (ordine dei byte). A seconda dell'architettura del computer, l'ordine in cui i dati sono memorizzati nella memoria può variare. I metodi di DataView
hanno opzioni per specificare l'endianness.
1const buffer = new ArrayBuffer(4);
2const view = new DataView(buffer);
3
4// Write a 32-bit integer in little-endian format
5view.setInt32(0, 42, true); // true indicates little-endian
6console.log(view.getInt32(0, true)); // 42
Se non specifichi il corretto endianness, i dati potrebbero non essere interpretati correttamente in ambienti diversi, quindi è particolarmente importante fare attenzione nelle comunicazioni di rete o nelle operazioni sui file.
Applicazioni di ArrayBuffer
ArrayBuffer
è uno strumento potente frequentemente utilizzato nello sviluppo web e nelle API dei browser. Vediamo alcuni esempi di applicazioni.
Ricezione e elaborazione dei dati binari
Ad esempio, puoi recuperare dati binari da un server utilizzando XMLHttpRequest
o l'API fetch
e gestirli come un ArrayBuffer
.
1fetch('https://codesparklab.com/image.jpg')
2 .then(response => response.arrayBuffer())
3 .then(buffer => {
4 const view = new Uint8Array(buffer);
5 console.log(view);
6 });
- In questo esempio, i dati dell'immagine vengono recuperati dal server e gestiti come un
Uint8Array
. In questo modo, puoi elaborare i dati ricevuti dal server utilizzandoArrayBuffer
.
Utilizzo in WebGL
In WebGL, ArrayBuffer
viene utilizzato per gestire efficientemente dati binari come dati sui vertici e dati sui colori.
1const vertices = new Float32Array([
2 -1.0, -1.0,
3 1.0, -1.0,
4 1.0, 1.0,
5 -1.0, 1.0
6]);
7
8// Send data to the WebGL buffer
9const buffer = gl.createBuffer();
10gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
11gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
- In questo esempio, si utilizza
Float32Array
per definire le coordinate dei vertici di un rettangolo e inviarle a un buffer WebGL.
Gestione della Memoria e ArrayBuffer
ArrayBuffer
gestisce la memoria a livello di byte, rendendolo molto efficiente, ma è necessario prestare attenzione alla gestione della memoria. Quando si lavora con grandi dati binari, è importante rilasciare correttamente gli ArrayBuffer
non utilizzati. Sebbene JavaScript esegua automaticamente la garbage collection, se un ArrayBuffer
continua ad essere referenziato, può causare perdite di memoria.
Riepilogo
ArrayBuffer
fornisce le basi per l'elaborazione dei dati binari in JavaScript. Combinando TypedArray
e DataView
, è possibile gestire i dati binari in modo efficiente e flessibile. Sono strumenti indispensabili nello sviluppo web, specialmente in molte situazioni che implicano la gestione di dati binari come la comunicazione di rete e WebGL. Capendo correttamente come funzionano e usandoli adeguatamente, è possibile migliorare le prestazioni e l'efficienza.
Puoi seguire l'articolo sopra utilizzando Visual Studio Code sul nostro canale YouTube. Controlla anche il nostro canale YouTube.