Start · Sprachen · JavaScript · Referenz · TypedArray.of()

TypedArray.of()

Methode

Erstellt ein neues typisiertes Array (z. B. <code>Uint8Array</code>, <code>Float32Array</code>) aus einer variablen Anzahl von Argumenten.

seit JavaScript ES2015 Kategorie: method-property

Signatur

TypedArray.of(...elements)

Beschreibung

TypedArray.of() ist eine statische Methode, die es auf jedem konkreten Konstruktor für typisierte Arrays gibt, etwa Int8Array.of(), Uint8Array.of(), Float64Array.of() oder BigInt64Array.of(). Jedes übergebene Argument wird zu einem Element des neuen Arrays. Die Länge des Ergebnisses entspricht der Anzahl der Argumente.

Sie ist das Gegenstück zu Array.of() und löst dasselbe Problem: Der Konstruktor new Uint8Array(5) legt ein Array mit fünf Nullen an und kein Array mit dem Element 5. Uint8Array.of(5) dagegen liefert eindeutig [5]. Das ist praktisch, wenn man feste Byte-Folgen, Farbwerte, Vektoren oder Matrizen direkt im Code angeben will.

Jeder Wert wird in den Elementtyp des Ziel-Arrays umgewandelt. Bei Ganzzahl-Typen wird abgeschnitten und modulo gerechnet, bei Uint8ClampedArray auf 0–255 begrenzt, bei Float-Typen ggf. gerundet. BigInt64Array und BigUint64Array erwarten BigInt-Werte. Da this als Konstruktor verwendet wird, funktioniert of() auch mit eigenen Unterklassen typisierter Arrays.

Parameter

Name Typ Default Beschreibung
$...elements number | bigint Beliebig viele Werte, die zu Elementen des neuen typisierten Arrays werden. Sie werden in den Elementtyp umgewandelt (bei BigInt64Array/BigUint64Array müssen es BigInt-Werte sein).

Rückgabewert

Typ
TypedArray
Beschreibung
Eine neue Instanz des jeweiligen typisierten Array-Typs (z. B. Uint8Array), die die übergebenen Werte enthält. Ohne Argumente entsteht ein leeres Array der Länge 0.

Beispiele

Einfache Erzeugung und Unterschied zum Konstruktor

const a = Uint8Array.of(5);
const b = new Uint8Array(5);

console.log(a); // ein Element mit dem Wert 5
console.log(b); // fünf Nullen

const leer = Int16Array.of();
console.log(leer.length);
Uint8Array(1) [ 5 ] Uint8Array(5) [ 0, 0, 0, 0, 0 ] 0

Typumwandlung und Überlauf

console.log(Uint8Array.of(1, 255, 256, -1, 3.7));
console.log(Uint8ClampedArray.of(300, -20, 127.5));
console.log(Int8Array.of(128, '42', 'abc'));
Uint8Array(5) [ 1, 255, 0, 255, 3 ] Uint8ClampedArray(3) [ 255, 0, 128 ] Int8Array(3) [ -128, 42, 0 ]

Magic Bytes einer PNG-Datei prüfen

const PNG_SIGNATUR = Uint8Array.of(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a);

const istPng = async (datei) => {
  const kopf = new Uint8Array(await datei.slice(0, 8).arrayBuffer());
  return PNG_SIGNATUR.every((byte, i) => kopf[i] === byte);
};

// Browser: document.querySelector('input[type=file]').files[0]
// istPng(datei).then(console.log);

BigInt-Arrays und Vektoren für WebGL

const ids = BigUint64Array.of(1n, 2n ** 63n, 42n);
console.log(ids[1]);

// Dreieck als Float32-Vertexdaten (x, y)
const vertices = Float32Array.of(
   0.0,  0.5,
  -0.5, -0.5,
   0.5, -0.5
);
console.log(vertices.length, vertices.BYTES_PER_ELEMENT);
9223372036854775808n 6 4

// Wichtig · Fallstricke

  • Kein globales TypedArray: TypedArray ist nur ein Oberbegriff (die abstrakte Basis, erreichbar per Object.getPrototypeOf(Int8Array)). Direkt aufgerufen wirft Object.getPrototypeOf(Int8Array).of(1) einen TypeError. Man ruft die Methode immer auf einem konkreten Typ auf, z. B. Float32Array.of().
  • Stiller Datenverlust: Werte außerhalb des Wertebereichs werden ohne Fehlermeldung umgebrochen (Uint8Array.of(256) → 0), Nachkommastellen werden bei Ganzzahl-Typen abgeschnitten, und nicht-numerische Werte werden zu 0 (bzw. NaN bei Float-Typen).
  • BigInt vs. Number: BigInt64Array.of(1) wirft einen TypeError. Umgekehrt führt Int32Array.of(1n) ebenfalls zu einem TypeError. Zahlentypen nicht mischen.
  • Nicht verwechseln mit from(): of() nimmt einzelne Argumente entgegen. Für vorhandene Arrays oder andere Iterables ist TypedArray.from() gedacht. Bei sehr vielen Werten solltest du den Spread-Operator (Uint8Array.of(...riesig)) vermeiden, weil sonst die maximale Argumentanzahl der Engine überschritten werden kann (RangeError).
  • Kompatibilität: Wird seit ES2015 von allen modernen Browsern und Node.js unterstützt. Die BigInt-Varianten gibt es seit ES2020.