Signatur
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
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`);
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);
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);
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;
}
}
// Wichtig · Fallstricke
- Kein Abbruch möglich: Mit
breakoderreturnlässt sich die Schleife nicht vorzeitig verlassen. Einreturnim Callback überspringt nur das aktuelle Element. Für einen Abbruch eignen sichfor...of,some(),every()oderfind(). - Nicht asynchron:
forEach()wartet nicht auf Promises.async-Callbacks laufen deshalb parallel und ohne Reihenfolgegarantie für ihre Ergebnisse. Für nacheinander abzuarbeitende Schritte istfor...ofmitawaitdie richtige Wahl. - Typumwandlung beim Schreiben: Zuweisungen wie
arr[i] = xwerden in den Elementtyp umgewandelt. BeiUint8Arraywird modulo 256 gerechnet (z. B.256→0), beiUint8ClampedArraywird auf 0–255 begrenzt, und Nachkommastellen fallen bei Ganzzahltypen weg. - BigInt-Arrays: Bei
BigInt64ArrayundBigUint64Arraysind die Elemente vom Typbigint. Wer sie mitnumbermischt, bekommt einenTypeError. - Abgetrennter Puffer: Wurde der zugrunde liegende
ArrayBufferabgetrennt (z. B. durch Übertragung perpostMessage), löst der Aufruf einenTypeErroraus. - 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.