Signatur
Beschreibung
Die Methode substr() schneidet einen Teilstring aus einem String heraus. Anders als slice() und substring() erwartet sie als zweites Argument keinen End-Index, sondern eine Länge, also die Anzahl der Zeichen ab start. Der ursprüngliche String wird dabei nicht verändert.
Ein negativer start-Wert wird vom Ende des Strings aus gezählt: -1 steht für das letzte Zeichen, -3 für das drittletzte. Ist length negativ, 0 oder NaN, ist das Ergebnis ein leerer String. Fehlt length oder ist es undefined, wird bis zum Ende des Strings gelesen.
Wichtig: substr() gilt als veraltet. Es steht nur im Anhang B der ECMAScript-Spezifikation („Zusätzliche Funktionen für Webbrowser“) und ist nicht Teil der Kernsprache. In neuem Code solltest du slice(start, start + length) verwenden. Diese Methode verhält sich genauso, unterstützt ebenfalls negative Indizes und ist zukunftssicher.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $start Pflicht | number | Index des ersten Zeichens, das übernommen wird. Negative Werte zählen vom Ende (str.length + start). Ist der Wert nach der Umrechnung kleiner als 0, wird 0 verwendet. Ist er größer oder gleich str.length, ist das Ergebnis ein leerer String. NaN wird wie 0 behandelt. |
|
| $length | number | str.length - start | Anzahl der Zeichen, die übernommen werden. Werte ≤ 0 und NaN ergeben einen leeren String. Werte über die restliche Länge hinaus werden auf das Stringende begrenzt. |
Rückgabewert
Beispiele
Grundlagen: Start und Länge
const text = 'Programmierung';
console.log(text.substr(0, 7)); // ab Index 0, 7 Zeichen
console.log(text.substr(7)); // ab Index 7 bis zum Ende
console.log(text.substr(-5, 3)); // 5. Zeichen von hinten, 3 Zeichen
console.log(text.substr(3, 0)); // Länge 0
console.log(text.substr(3, -2)); // negative Länge
Dateiendung auslesen (Legacy-Code)
const getExtension = (filename) => {
const dot = filename.lastIndexOf('.');
return dot === -1 ? '' : filename.substr(dot + 1);
};
console.log(getExtension('bericht.final.pdf'));
console.log(getExtension('README'));
Moderner Ersatz mit slice()
const iso = '2024-05-17T09:30:00Z';
// Alt: substr(start, länge)
const jahrAlt = iso.substr(0, 4);
const monatAlt = iso.substr(5, 2);
// Neu: slice(start, start + länge)
const jahr = iso.slice(0, 4);
const monat = iso.slice(5, 5 + 2);
const zeit = iso.slice(-9, -1); // negative Indizes funktionieren auch hier
console.log(jahrAlt === jahr, monatAlt === monat);
console.log(`${jahr}/${monat}`, zeit);
Unterschied zu substring() und slice()
const s = 'JavaScript';
console.log(s.substr(4, 3)); // Länge 3
console.log(s.substring(4, 3)); // Indizes werden getauscht -> (3, 4)
console.log(s.slice(4, 3)); // Ende vor Start -> leer
console.log(s.substr(-6)); // negativ = vom Ende
console.log(s.substring(-6)); // negativ wird zu 0
// Wichtig · Fallstricke
- Veraltet:
substr()steht nur in Annex B der ECMAScript-Spezifikation. Alle Browser und Node.js unterstützen die Methode zwar, andere JavaScript-Umgebungen (z. B. eingebettete Engines) müssen sie aber nicht anbieten. Linter wie ESLint (no-restricted-properties) oder die TypeScript-Bibliothek kennzeichnen sie als veraltet. - Verwechslungsgefahr: Das zweite Argument ist eine Länge, kein End-Index. Wer von
substring()oderslice()kommt, bekommt hier leicht falsche Ergebnisse. Die direkte Umstellung lautet:str.substr(a, n)→str.slice(a, a + n). Achtung bei negativema: Wenna + ndabei0oder größer wird, verwendestr.slice(a).slice(0, n). - Alte Internet Explorer (≤ 8): Diese Versionen haben negative
start-Werte fälschlich als0behandelt. Für heutige Browser spielt das keine Rolle mehr, in sehr altem Legacy-Code kann es aber noch auftauchen. - Unicode: Wie alle String-Methoden arbeitet
substr()mit UTF-16-Codeeinheiten. Emojis und andere Zeichen außerhalb der BMP können dabei in der Mitte zerschnitten werden. Das ergibt ungültige Surrogat-Hälften. Für eine sichere Zerlegung eignen sich[...str]oderIntl.Segmenter.