Typed arrays (Uint8Array, Float64Array…) în JavaScript

Date binare (ArrayBuffer, typed arrays) ES2015 (Float16Array: ES2025)

Tablouri de lungime fixă cu numere de un singur tip, pentru date binare: imagini, fișiere, audio, rețea.

Sintaxă
new Uint8Array(lungime | tablou | buffer)
Uint8Array.from(sursa, functieMap)
Uint8Array.of(element1, ...)

Ce face Typed arrays (Uint8Array, Float64Array...)

Un typed array este o vedere asupra unui bloc de memorie (ArrayBuffer) în care fiecare element are același tip și aceeași mărime. Tipuri: Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float16Array, Float32Array, Float64Array, BigInt64Array, BigUint64Array.

Lungimea este fixă (nu există push sau pop), iar valorile sunt convertite la tipul tabloului: într-un Uint8Array, 256 devine 0 (depășire), iar într-un Uint8ClampedArray devine 255. Toate typed arrays moștenesc dintr-un părinte comun, numit în documentație TypedArray.

Metodele from și of, precum și metodele de parcurgere și căutare (at, map, filter, reduce, reduceRight, forEach, find, findIndex, findLast, findLastIndex, every, some, includes, indexOf, lastIndexOf, join, fill, copyWithin, slice, sort, reverse, toSorted, toReversed, with, keys, values, entries, toString, toLocaleString) funcționează la fel ca la tablourile obișnuite. Diferențe: map și filter returnează tot un typed array, iar sort fără funcție sortează numeric, nu alfabetic.

Parametri

Parametru Descriere
lungime | tablou | buffer Numărul de elemente (inițial 0), un tablou cu valori sau un ArrayBuffer (cu poziție și lungime opționale).

Ce returnează

Un typed array nou.

Exemple

Exemplul 1: Creare și conversia valorilor

const octeti = new Uint8Array([10, 255, 256, -1]);
const limitat = new Uint8ClampedArray([10, 255, 256, -1]);

console.log(octeti);
console.log(limitat);
console.log(new Float32Array(3));
console.log(Int16Array.of(1, 2, 3), Uint8Array.from("123", Number));

Rezultat

Uint8Array(4) [ 10, 255, 0, 255 ]
Uint8ClampedArray(4) [ 10, 255, 255, 0 ]
Float32Array(3) [ 0, 0, 0 ]
Int16Array(3) [ 1, 2, 3 ] Uint8Array(3) [ 1, 2, 3 ]

Exemplul 2: Metodele de tablou

const masuratori = new Float64Array([3.5, 10, 2, 7.25]);

console.log(masuratori.toSorted());
console.log(masuratori.map((x) => x * 2));
console.log(masuratori.reduce((s, x) => s + x, 0));
console.log(masuratori.at(-1), masuratori.includes(10), masuratori.join(" | "));
console.log(Array.isArray(masuratori), Array.from(masuratori));

Rezultat

Float64Array(4) [ 2, 3.5, 7.25, 10 ]
Float64Array(4) [ 7, 20, 4, 14.5 ]
22.75
7.25 true 3.5 | 10 | 2 | 7.25
false [ 3.5, 10, 2, 7.25 ]

Exemplul 3: Două vederi asupra aceleiași memorii

Ambele vederi citesc aceiași 4 octeți. Ordinea lor în Uint8Array depinde de procesor; pe aproape toate calculatoarele și telefoanele (little-endian), octetul cel mai puțin semnificativ vine primul. Pentru o ordine controlată folosește DataView.

const buffer = new ArrayBuffer(4);
const cuvant = new Uint32Array(buffer);
const octeti = new Uint8Array(buffer);

cuvant[0] = 0x01020304;
console.log(octeti);

Rezultat

Uint8Array(4) [ 4, 3, 2, 1 ]

Greșeli frecvente

  • Încerci push pe un typed array și primești TypeError. Lungimea este fixă; creează un tablou nou mai mare și copiază datele cu set.
  • Pui valori prea mari într-un Uint8Array și ele „se întorc” (256 devine 0). Alege tipul potrivit sau Uint8ClampedArray.
  • Folosești map pentru a transforma numere în texte. Rezultatul este tot un typed array numeric; transformă întâi în tablou obișnuit cu Array.from.

Comenzi înrudite

  • ArrayBuffer: Un bloc de memorie brută, de lungime dată în octeți; citit și scris prin typed arrays sau DataView.
  • TypedArray.prototype.set / subarray: set copiază valori într-un typed array; subarray creează o vedere asupra unei bucăți, fără copiere.
  • DataView: Citește și scrie numere de tipuri diferite la orice poziție dintr-un ArrayBuffer, cu ordinea octeților aleasă.