Signatur
Beschreibung
lastIndexOf() ist das Gegenstück zu indexOf(): Die Methode sucht einen Teilstring, liefert aber die Position des letzten Vorkommens. Der zurückgegebene Index wird trotzdem ganz normal vom Anfang des Strings aus gezählt (beginnend bei 0).
Typische Einsatzfälle sind alle Aufgaben, bei denen das Ende eines Strings wichtig ist: die Dateiendung nach dem letzten Punkt ermitteln, den Dateinamen nach dem letzten / in einem Pfad herausziehen oder den letzten Trenner in einer Zeichenkette finden. Meist kombiniert man das Ergebnis mit slice() oder substring().
Mit dem optionalen Parameter position legt man fest, ab welchem Index rückwärts gesucht wird. Gefunden werden dann nur Vorkommen, die an einem Index <= position beginnen. Ist position größer als die Länge des Strings oder fehlt der Parameter, wird der gesamte String durchsucht. Negative Werte werden wie 0 behandelt.
Die Suche unterscheidet zwischen Groß- und Kleinschreibung und arbeitet mit UTF-16-Codeeinheiten. Wenn du nur wissen willst, ob ein Teilstring vorkommt, sind includes() oder endsWith() lesbarer.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $searchString Pflicht | string | Der gesuchte Teilstring. Andere Werte werden in einen String umgewandelt. Achtung: Ohne Argument wird nach "undefined" gesucht. |
|
| $position | number | +Infinity | Index, ab dem rückwärts gesucht wird. Das Vorkommen muss an diesem Index oder davor beginnen. NaN und undefined bedeuten „ganzen String durchsuchen“, negative Werte werden wie 0 behandelt. |
Rückgabewert
searchString (vom Anfang des Strings aus gezählt) oder -1, wenn er nicht vorkommt. Bei einem leeren searchString ist das Ergebnis Math.min(position, str.length).Beispiele
Grundlagen und der Parameter position
const wort = 'canal';
console.log(wort.lastIndexOf('a')); // letztes 'a'
console.log(wort.lastIndexOf('a', 2)); // nur bis Index 2 suchen
console.log(wort.lastIndexOf('a', 0)); // nur Index 0 prüfen
console.log(wort.lastIndexOf('x')); // nicht vorhanden
console.log(wort.lastIndexOf('c', -5)); // negativ → wie 0
console.log(wort.lastIndexOf('')); // leerer String → Länge
Dateiendung und Dateinamen ermitteln
const getExtension = (dateiname) => {
const punkt = dateiname.lastIndexOf('.');
// kein Punkt oder versteckte Datei wie ".bashrc" → keine Endung
return punkt > 0 ? dateiname.slice(punkt + 1) : '';
};
const getBasename = (pfad) => pfad.slice(pfad.lastIndexOf('/') + 1);
console.log(getExtension('archiv.tar.gz'));
console.log(getExtension('.bashrc'));
console.log(getBasename('/home/user/docs/bericht.pdf'));
console.log(getBasename('readme.md')); // kein '/' → -1 + 1 = 0
Alle Vorkommen rückwärts finden
const findAllFromEnd = (text, begriff) => {
const treffer = [];
let pos = text.lastIndexOf(begriff);
while (pos !== -1) {
treffer.push(pos);
if (pos === 0) break; // wichtig: sonst Endlosschleife!
pos = text.lastIndexOf(begriff, pos - 1);
}
return treffer;
};
console.log(findAllFromEnd('abcabcabc', 'abc'));
Suche ohne Beachtung der Groß-/Kleinschreibung
const satz = 'JavaScript ist toll. Ich mag javascript.';
console.log(satz.lastIndexOf('JavaScript'));
console.log(satz.toLowerCase().lastIndexOf('javascript'));
// Wichtig · Fallstricke
- Groß-/Kleinschreibung: Die Suche unterscheidet immer zwischen Groß- und Kleinbuchstaben. Für eine Suche ohne diesen Unterschied beide Seiten vorher mit
toLowerCase()umwandeln. - Endlosschleife: Negative Werte für
positionwerden wie0behandelt.str.lastIndexOf(x, pos - 1)mitpos === 0findet also denselben Treffer bei Index 0 immer wieder. Diesen Fall in Schleifen gesondert abbrechen. - Auf
-1prüfen:if (str.lastIndexOf(x))ist ein häufiger Fehler, denn ein Treffer bei Index0ist falsy und-1ist truthy. Deshalb immer explizit mit!== -1vergleichen oder gleichincludes()bzw.endsWith()verwenden. - position betrifft den Anfang des Treffers:
'abcabc'.lastIndexOf('bc', 4)ergibt4, obwohl der Treffer über Index 4 hinausgeht. - Keine regulären Ausdrücke:
searchStringwird immer als einfacher Text behandelt. Für Mustersearch()odermatchAll()verwenden. - Unicode: Die Indizes zählen UTF-16-Codeeinheiten. Emojis und andere Zeichen außerhalb der BMP belegen jeweils zwei Positionen.
- Die Methode ist in allen Browsern und in Node.js verfügbar.