`ArrayBuffer` i JavaScript
Den här artikeln förklarar ArrayBuffer
i JavaScript.
Vi kommer att förklara allt om ArrayBuffer
, från grunderna till dess användning, relaterade typer och praktiska tillämpningar.
YouTube Video
ArrayBuffer
i JavaScript
ArrayBuffer
i JavaScript är ett objekt för att hantera lågnivå binärdata och är särskilt användbart för att manipulera binärdata i WebAPI:er, filoperationer och nätverkskommunikation.
Vad är ArrayBuffer
ArrayBuffer
är en datastruktur för att hantera binärdata med fast längd. Det möjliggör hantering av rå binärdata som inte kan hanteras av vanliga JavaScript-arrayer eller objekt.
ArrayBuffer
kan inte direkt manipulera data. Istället läses och skrivs data med hjälp av TypedArray
eller DataView
baserat på en ArrayBuffer
.
ArrayBuffer
är särskilt användbart i följande situationer:.
- När man bearbetar binärdata som mottagits från nätverket
- När effektiv datadelning i
Web Worker
krävs. - När du utför bildbehandling eller 3D-rendering med Canvas eller WebGL.
- När du hanterar filer (särskilt binära filer).
Skapa en ArrayBuffer
Låt oss börja med hur man skapar en instans av ArrayBuffer
. ArrayBuffer
allokerar minne i byte-enheter, så du specificerar dess storlek vid skapandet.
1const buffer = new ArrayBuffer(16); // Create a 16-byte buffer
2console.log(buffer.byteLength); // 16
- I det här exemplet allokeras en buffert på 16 byte. Den här bufferten innehåller ännu ingen data.
Manipulera data med TypedArray
Du kan inte direkt komma åt en ArrayBuffer
, så du använder en TypedArray
för att läsa och skriva data. TypedArray
erbjuder olika typer av visningar som Int8Array
och Float32Array
, vilket möjliggör effektiv åtkomst till binärdata.
Exempel med 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
kan lagra data i varje byte, vilket gör att bufferten kan innehålla 8 element. På detta sätt kan du manipulera data effektivt genom att använda olika typer av vyer.
Andra exempel på TypedArray
JavaScript har olika typer av TypedArray
. Till exempel, om du vill hantera 32-bitars osignerade heltal, använder du Uint32Array
.
1const buffer = new ArrayBuffer(16);
2const uint32View = new Uint32Array(buffer);
3
4uint32View[0] = 123456;
5console.log(uint32View[0]); // 123456
Uint32Array
kan lagra data i 4-byte-enheter, så bufferten kan innehålla fyra element. Det är viktigt att välja rättTypedArray
beroende på vilken typ av data du hanterar.
Flexibel datamanipulation med hjälp av DataView
TypedArray
kan enbart hantera data av en fast typ, men genom att använda DataView
kan du skriva data av vilken typ som helst till valfri plats. Detta är särskilt användbart när du arbetar med buffertar som innehåller blandade datatyper.
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
Med hjälp av DataView
kan du ange en byteförskjutning och läsa eller skriva data av olika typer. Detta är mycket användbart vid hantering av komplexa binära strukturer som nätverksprotokoll eller filformat.
Tänk på byteordning (Endianness)
När du använder DataView
måste du också vara uppmärksam på byteordning (endianness). Beroende på datorarkitekturen kan ordningen i vilken data lagras i minnet variera. DataView
-metoder har alternativ för att ange byteordning.
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
Om du inte anger korrekt byteordning kan data tolkas fel i olika miljöer, så det är särskilt viktigt att vara försiktig vid nätverkskommunikation eller filoperationer.
Användningsområden för ArrayBuffer
ArrayBuffer
är ett kraftfullt verktyg som ofta används i webbutveckling och webbläsarens API:er. Låt oss titta på några exempel på användningsområden.
Ta emot och bearbeta binär data
Till exempel kan du hämta binär data från en server med hjälp av XMLHttpRequest
eller fetch
-API och hantera den som en 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 });
- I det här exemplet hämtas bilddata från servern och hanteras som en
Uint8Array
. På detta sätt kan du bearbeta data som tagits emot från servern med hjälp avArrayBuffer
.
Användning inom WebGL
I WebGL används ArrayBuffer
för att effektivt hantera binär data som vertexdata och färgdata.
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);
- I det här exemplet används
Float32Array
för att definiera vertexkoordinaterna för en rektangel och skicka dem till en WebGL-buffert.
Minneshantering och ArrayBuffer
ArrayBuffer
hanterar minnet på bytnivå, vilket gör det mycket effektivt, men du måste också vara försiktig med minneshantering. När du arbetar med stora binära data är det viktigt att korrekt frigöra oanvända ArrayBuffer
. Även om JavaScript automatiskt utför skräpsamling kan det orsaka minnesläckor om en ArrayBuffer
fortsätter att refereras.
Sammanfattning
ArrayBuffer
utgör grunden för bearbetning av binära data i JavaScript. Genom att kombinera TypedArray
och DataView
är det möjligt att hantera binära data effektivt och flexibelt. De är oumbärliga verktyg inom webbutveckling, särskilt i många situationer som involverar hantering av binära data som nätverkskommunikation och WebGL. Genom att förstå dem korrekt och använda dem på lämpligt sätt kan du förbättra prestanda och effektivitet.
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.