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

TypedArray.prototype.findLast()

Methode

Durchläuft ein typisiertes Array von hinten nach vorn und gibt den ersten Wert zurück, für den <code>callbackFn</code> einen truthy-Wert liefert, sonst <code>undefined</code>.

seit JavaScript ES2023 Kategorie: method-property

Signatur

TypedArray.prototype.findLast(callbackFn, thisArg)

Beschreibung

findLast() ist das Gegenstück zu find(): Die Methode ruft die Testfunktion für jedes Element eines typisierten Arrays (z. B. Uint8Array, Float32Array, BigInt64Array) in absteigender Indexreihenfolge auf. Sobald die Funktion einen truthy-Wert zurückgibt, bricht die Suche ab und der zugehörige Elementwert wird zurückgegeben.

Nützlich ist die Methode immer dann, wenn der letzte passende Eintrag gesucht wird, etwa der letzte Messwert über einem Schwellenwert in einem Sensor-Puffer, das letzte Nicht-Null-Byte in einem Binärpuffer oder der jüngste Eintrag in einer zeitlich geordneten Datenreihe. Gegenüber [...arr].reverse().find() spart sie die Kopie und das Umdrehen.

Wird kein passendes Element gefunden, gibt findLast() undefined zurück. Da typisierte Arrays keine Lücken haben und nur Zahlen (bzw. BigInts) enthalten, ist ein Ergebnis von undefined immer eindeutig als „nicht gefunden“ zu deuten. Wird der Index benötigt, verwendet man findLastIndex().

Die Methode verändert das Array nicht selbst, die Callback-Funktion kann dies aber tun. Die Länge wird vor dem ersten Aufruf festgelegt.

Parameter

Name Typ Default Beschreibung
$callbackFn Pflicht (element: number | bigint, index: number, array: TypedArray) => unknown Testfunktion, die für jedes Element aufgerufen wird. Erhält element, index und das array selbst. Ein truthy-Rückgabewert beendet die Suche.
$thisArg any undefined Wert, der innerhalb von callbackFn als this verwendet wird. Bei Pfeilfunktionen wirkungslos.

Rückgabewert

Typ
number | bigint | undefined
Beschreibung
Der Wert des Elements mit dem höchsten Index, das den Test besteht, oder undefined, wenn keines passt.

Beispiele

Letzten Messwert über einem Schwellenwert finden

const temperaturen = new Float32Array([18.5, 22.1, 25.4, 19.8, 23.7, 17.2]);

const letzteWarme = temperaturen.findLast((t) => t > 23);
console.log(letzteWarme);

const extrem = temperaturen.findLast((t) => t > 40);
console.log(extrem);
23.700000762939453 undefined

Letztes Nicht-Null-Byte in einem Puffer ermitteln

const puffer = new Uint8Array([72, 105, 33, 0, 0, 0]);

const letztesByte = puffer.findLast((byte) => byte !== 0);
const index = puffer.findLastIndex((byte) => byte !== 0);

console.log(letztesByte, index);
// Nutzdaten ohne Auffüll-Nullen
console.log(new TextDecoder().decode(puffer.subarray(0, index + 1)));
33 2 Hi!

Mit Index und thisArg arbeiten

const werte = new Int16Array([5, -3, 8, -1, 4]);
const grenzen = { min: 0 };

const treffer = werte.findLast(function (wert, i) {
  console.log(`prüfe Index ${i}: ${wert}`);
  return wert < this.min;
}, grenzen);

console.log('Ergebnis:', treffer);
prüfe Index 4: 4 prüfe Index 3: -1 Ergebnis: -1

BigInt-Arrays durchsuchen

const zeitstempel = new BigUint64Array([1000n, 2500n, 4000n, 5200n]);

const vorGrenze = zeitstempel.findLast((ts) => ts < 4500n);
console.log(vorGrenze);
4000n

// Wichtig · Fallstricke

  • Kompatibilität: Neu in ES2023; unterstützt ab Chrome 97, Edge 97, Firefox 104, Safari 15.4 und Node.js 18. Für ältere Umgebungen ist ein Polyfill (z. B. core-js) nötig.
  • Gleitkomma-Genauigkeit: Bei Float32Array werden Werte auf 32 Bit gerundet – 23.7 erscheint als 23.700000762939453. Vergleiche mit === gegen Dezimalliterale schlagen daher oft fehl; besser Math.fround() oder Toleranzen verwenden.
  • Ergebnis 0 ist falsy: Ist der gefundene Wert 0 oder 0n, liefert if (arr.findLast(...)) fälschlich „nicht gefunden“. Stattdessen explizit auf !== undefined prüfen.
  • Die Methode ist nicht generisch: Aufruf auf gewöhnlichen Arrays oder Objekten per call() wirft einen TypeError (für normale Arrays gibt es Array.prototype.findLast()).
  • Wurde der zugrunde liegende ArrayBuffer abgetrennt (detached, z. B. nach postMessage mit Transfer), wirft der Aufruf einen TypeError.