Start · Sprachen · JavaScript · Referenz · TypedArray.prototype.forEach()

TypedArray.prototype.forEach()

Methode

Führt eine Callback-Funktion einmal für jedes Element eines typisierten Arrays (z. B. <code>Uint8Array</code>, <code>Float32Array</code>) in aufsteigender Indexreihenfolge aus.

seit JavaScript ES2015 Kategorie: method-property

Signatur

TypedArray.prototype.forEach(callbackFn, thisArg)

Beschreibung

forEach() durchläuft alle Elemente eines typisierten Arrays von Index 0 bis length - 1 und ruft für jedes Element die übergebene Funktion mit den Argumenten (element, index, array) auf. Die Methode arbeitet wie Array.prototype.forEach(), ist aber auf TypedArray-Instanzen wie Int16Array, Float64Array oder BigInt64Array zugeschnitten.

Sie eignet sich für Nebeneffekte: Werte protokollieren, Summen oder Statistiken sammeln, Daten in andere Strukturen übertragen oder Elemente direkt über den Index im Array ändern. Wenn du ein neues Array mit umgewandelten Werten brauchst, ist map() die bessere Wahl. Zum Aggregieren passt reduce().

Typisierte Arrays haben anders als normale Arrays keine Lücken. Deshalb wird der Callback immer für jeden Index aufgerufen. Die Anzahl der Durchläufe wird vor dem ersten Aufruf festgelegt. forEach() gibt immer undefined zurück und lässt sich deshalb nicht verketten.

Parameter

Name Typ Default Beschreibung
$callbackFn Pflicht (element: number | bigint, index: number, array: TypedArray) => void Funktion, die für jedes Element ausgeführt wird. Sie erhält das aktuelle element, dessen index und das durchlaufene array. Ihr Rückgabewert wird ignoriert.
$thisArg any undefined Wert, der beim Aufruf von callbackFn als this verwendet wird. Bei Pfeilfunktionen hat er keine Wirkung, da sie this aus dem umgebenden Gültigkeitsbereich übernehmen.

Rückgabewert

Typ
undefined
Beschreibung
Immer undefined. Die Methode wird nur wegen ihrer Nebeneffekte aufgerufen.

Beispiele

Messwerte ausgeben und aufsummieren

const temperaturen = new Float32Array([21.5, 22.25, 19.75, 23]);
let summe = 0;

temperaturen.forEach((wert, index) => {
  console.log(`Sensor ${index}: ${wert} °C`);
  summe += wert;
});

console.log(`Durchschnitt: ${summe / temperaturen.length} °C`);
Sensor 0: 21.5 °C Sensor 1: 22.25 °C Sensor 2: 19.75 °C Sensor 3: 23 °C Durchschnitt: 21.625 °C

Pixeldaten direkt verändern (Helligkeit invertieren)

// RGBA-Pixel wie aus ImageData.data
const pixel = new Uint8ClampedArray([255, 128, 0, 255, 10, 20, 30, 255]);

pixel.forEach((wert, i, arr) => {
  // Alphakanal (jeder 4. Wert) unverändert lassen
  if (i % 4 !== 3) arr[i] = 255 - wert;
});

console.log(pixel);
Uint8ClampedArray(8) [0, 127, 255, 255, 245, 235, 225, 255]

Nutzung von thisArg mit einer normalen Funktion

const zaehler = {
  gerade: 0,
  ungerade: 0,
  zaehle(wert) {
    wert % 2 === 0 ? this.gerade++ : this.ungerade++;
  }
};

const daten = new Int16Array([3, 8, -4, 7, 10]);
daten.forEach(function (wert) {
  this.zaehle(wert);
}, zaehler);

console.log(zaehler.gerade, zaehler.ungerade);
3 2

Vorzeitiger Abbruch: besser for...of verwenden

const bytes = new Uint8Array([4, 9, 0, 17, 3]);

// forEach lässt sich nicht mit break beenden – for...of schon
for (const [i, b] of bytes.entries()) {
  if (b === 0) {
    console.log(`Null-Byte an Position ${i}`);
    break;
  }
}
Null-Byte an Position 2

// Wichtig · Fallstricke

  • Kein Abbruch möglich: Mit break oder return lässt sich die Schleife nicht vorzeitig verlassen. Ein return im Callback überspringt nur das aktuelle Element. Für einen Abbruch eignen sich for...of, some(), every() oder find().
  • Nicht asynchron: forEach() wartet nicht auf Promises. async-Callbacks laufen deshalb parallel und ohne Reihenfolgegarantie für ihre Ergebnisse. Für nacheinander abzuarbeitende Schritte ist for...of mit await die richtige Wahl.
  • Typumwandlung beim Schreiben: Zuweisungen wie arr[i] = x werden in den Elementtyp umgewandelt. Bei Uint8Array wird modulo 256 gerechnet (z. B. 256 → 0), bei Uint8ClampedArray wird auf 0–255 begrenzt, und Nachkommastellen fallen bei Ganzzahltypen weg.
  • BigInt-Arrays: Bei BigInt64Array und BigUint64Array sind die Elemente vom Typ bigint. Wer sie mit number mischt, bekommt einen TypeError.
  • Abgetrennter Puffer: Wurde der zugrunde liegende ArrayBuffer abgetrennt (z. B. durch Übertragung per postMessage), löst der Aufruf einen TypeError aus.
  • Leistung: Bei sehr großen Arrays in rechenintensivem Code ist eine klassische for-Schleife oft etwas schneller, weil kein Funktionsaufruf pro Element entsteht.
  • Die Methode wird von allen modernen Browsern sowie von Node.js ab Version 4 unterstützt.