TypedArray i JavaScript
Den här artikeln förklarar TypedArray
i JavaScript.
Vi kommer att förklara i detalj den grundläggande konceptet med TypedArray
, varje typ, hur man använder dem och specifika användningsområden.
YouTube Video
TypedArray i JavaScript
TypedArray
i JavaScript är ett objekt för att effektivt hantera buffrad binär data. TypedArray
allokerar och hanterar minne baserat på specifika datatyper. Till skillnad från vanliga arrayer kan TypedArray
endast innehålla binära data med fast storlek, inte godtyckliga datatyper.
Den grundläggande strukturen för TypedArray
Huvudkomponenterna i en TypedArray
är ArrayBuffer
och själva TypedArray
.
- ArrayBuffer: En buffer med fast storlek som allokerar binär data i minnet. Den här bufferten är bara ett dataområde och kan inte läsas från eller skrivas till direkt.
- TypedArray: Ett omslagsobjekt som tillämpar en specifik datatyp på bufferten, vilket möjliggör dataåtkomst och manipulation.
Grundläggande användningsexempel
Följande är ett exempel på att skapa en ArrayBuffer
och sedan skapa en TypedArray
baserat på den.
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
- I det här exemplet skapas en
ArrayBuffer
, och sedan skapas enUint8Array
baserat på den bufferten. Varje element behandlas som ett 8-bitars osignerat heltal som lagrar värden endast inom det angivna intervallet.
Typer av TypedArray
Det finns olika typer av TypedArray
för varje datatyp. De viktigaste är följande.
Typnamn | Elementstorlek | Beskrivning |
---|---|---|
Int8Array |
1 byte | 8-bitars heltal med tecken |
Uint8Array |
1 byte | 8-bitars heltal utan tecken |
Uint8ClampedArray |
1 byte | 8-bitars heltal utan tecken (håller klämda värden) |
Int16Array |
2 byte | 16-bitars heltal med tecken |
Uint16Array |
2 byte | 16-bitars heltal utan tecken |
Int32Array |
4 byte | 32-bitars heltal med tecken |
Uint32Array |
4 byte | 32-bitars heltal utan tecken |
Float32Array |
4 byte | 32-bitars flyttal |
Float64Array |
8 byte | 64-bitars flyttal |
Dessa TypedArray
s är alla minneseffektiva och lämpliga för att hantera stora mängder data.
Hantering av TypedArrays
Du kan komma åt data i en TypedArray
med hjälp av index, precis som med en vanlig array, men flera speciella metoder tillhandahålls också.
Sätta värden
I en TypedArray
kan du tilldela flera värden samtidigt med hjälp av set
-metoden.
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
- Den här koden använder metoden
set
för att tilldela flera värden samtidigt till enInt16Array
, och visar varje element i konsolen.
Hämta en delmängd (subarray)
För att hämta en del av en TypedArray
som en delmängd, använd metoden subarray
. Den här refererar till samma buffer som den ursprungliga TypedArray
.
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]
- Den här koden hämtar ett angivet intervall av element från en
Int16Array
med metodensubarray
och visar delarrayen i konsolen.
Kopiera buffrar
Bufferten för en TypedArray
kan också kopieras till en annan TypedArray
. Med hjälp av set
-metoden kan du kopiera från en specifik position.
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]
- Den här koden kopierar innehållet i en
Uint8Array
till en annan array med metodenset
och visar den kopierade arrayen i konsolen.
Användning av DataView
Medan en TypedArray
hanterar buffrar med en fast datatyp, är DataView
ett gränssnitt som tillåter flexibel hantering av binär data med godtyckliga offset och datatyper. Detta möjliggör blandning av olika typer i samma 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
-
Den här koden använder en
DataView
för att skriva olika datatyper—32-bitars heltal och 32-bitars flyttal—på samma buffer och kontrollerar resultaten. -
DataView
erbjuder större flexibilitet för dataåtkomst änTypedArray
och är särskilt användbar för att arbeta med filer i binärt format eller nätverksprotokoll.
Användningsområden för TypedArray
TypedArray
används främst för effektiv hantering av stora mängder binär data. Specifika användningsområden inkluderar följande.
Bildbehandling
TypedArray
används vid manipulering av pixelinformation i bilddata. Med hjälp av Uint8Array
håller du RGBA-värdena för varje pixel och utför bildredigering och bearbetning.
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}
- Den här koden skapar bilddata med en bredd på 100 och en höjd på 100 i RGBA-format med hjälp av en
Uint8Array
och sätter alla pixlar till rött.
Gränssnitt med WebAssembly
TypedArray
används för att utbyta binärdata mellan JavaScript och WebAssembly. Genom att dela minnesutrymmet mellan JavaScript och WebAssembly via ArrayBuffer
är snabb datautbyte möjligt.
Bearbetning av ljud- och videodata
TypedArray
spelar en viktig roll i bearbetning av ljud och video. Du kan lagra vågformer för ljuddata i Float32Array
för uppspelning och bearbetning.
Slutsats
TypedArray
är ett kraftfullt verktyg för att effektivt hantera stora mängder binärdata. Det är särskilt användbart i prestandakritiska applikationer som bildbearbetning, WebAssembly och ljud-/videobearbetning. TypedArray
har ett API som liknar vanliga arrayer, men det finns begränsningar kring minnesanvändning och datatyper, så korrekt differentiering i användningen krävs.
Du kan följa med i artikeln ovan med hjälp av Visual Studio Code på vår YouTube-kanal. Vänligen kolla även in YouTube-kanalen.