Die Überprüfung, ob eine Zeichenkette eine andere enthält (Teilstring-Suche), gehört nach wie vor zu den häufigsten Zeichenkettenoperationen in der JavaScript-Entwicklung. Ganz gleich, ob Sie Benutzereingaben validieren, Suchfilter in React-/Vue-Anwendungen implementieren, API-Antworten auswerten, Autovervollständigungsfunktionen erstellen oder Protokolle in Node.js verarbeiten – diese Überprüfung taucht überall auf.
Stand Februar 2026 ist ECMAScript 2026 (ES2026) der aktuelle oder in Kürze geltende Standard (Fertigstellung Mitte 2026). Der Kern String.prototype Methoden zur Erkennung von Teilzeichenfolgen — includes(), indexOf(), search(), und Regex .test() — bleiben seit ES2015/ES6 unverändert. In ES2025 oder ES2026 wurden keine wesentlichen neuen Methoden zur Zeichenfolgensuche eingeführt; Der Fokus liegt weiterhin auf Leistung, Lesbarkeit, Unicode-Korrektheit und modernen Best Practices in Engines wie V8 (Node 22+/Chrome 130+), SpiderMonkey (Firefox 135+) und JavaScriptCore (Safari 19+).
Dieser Leitfaden behandelt alle praktischen Techniken, die Leistungsrealitäten im Jahr 2026, Sonderfälle, Sicherheitsaspekte sowie produktionsreife Empfehlungen.
Warum Teilzeichenfolgen-Prüfungen überall vorkommen
- Benutzeroberfläche/UX: Live-Suche, Filterung nach Tags, Formularvalidierung
- Backend: Protokollauswertung, Routenabgleich, Inhaltsmoderation
- Datenverarbeitung: Filtern von Arrays mit Zeichenketten/Objekten
- Sicherheit: Erkennung bösartiger Muster (XSS-Payloads, verbotene Wörter)
- Leistungsabhängig: Autovervollständigung (Millionen von Prüfungen pro Sekunde), Echtzeitüberwachung
Kleine Ineffizienzen vervielfachen sich in Schleifen oder bei großen Datensätzen schnell.
1. Moderner Standard: String.prototype.includes()
Seit ES2015 die Methode der Wahl – übersichtlich, aussagekräftig und stark optimiert.
Unterschrift
js str.includes(searchString, position?)
Suchbegriff:zu suchendes Teilzeichenfolgenelement (in eine Zeichenkette umgewandelt; RegExp löst einen Fehler aus)Position(optional): Startindex (Standardwert 0; begrenzt auf ≥0)
Rücksendungen: boolesch
Beispiele
js
const phrase = "JavaScript im Jahr 2026 ist leistungsstark und schnell";
console.log(phrase.includes("2026")); // true
console.log(phrase.includes("2025")); // false
console.log(phrase.includes("script")); // true (Groß-/Kleinschreibung wird berücksichtigt)
console.log(phrase.includes("")); // true ← „empty“ passt immer
console.log(phrase.includes("fast", 30)); // true
console.log(phrase.includes("fast", 40)); // falseWarum sollte man includes() im Jahr 2026?
- Optimale Lesbarkeit: Bringt deutlich zum Ausdruck: “Ist es enthalten?”
- Motoroptimiert (V8/SpiderMonkey verwenden schnelle Boyer-Moore- oder Zwei-Wege-Algorithmen)
- Universelle Unterstützung: 100% in modernen Browsern/Node seit ca. 2017
Nachteile
- Nur Boolesche Werte (kein Index)
- Es wird stets zwischen Groß- und Kleinschreibung unterschieden
2. Klassisch & positionsabhängig: String.prototype.indexOf()
Ein bewährtes Arbeitstier aus der Zeit vor ES6 – immer noch hervorragend, wenn man die Position benötigt.
Unterschrift
js str.indexOf(searchString, fromIndex?)
Rücksendungen: erster Index ≥ fromIndex oder -1
Existenzprüfung
js
if (phrase.indexOf("2026") !== -1) { /* gefunden */ }
// Bevorzugter Stil:
if (phrase.indexOf("2026") >= 0) { /* gefunden */ }Alle Vorkommen finden
js
let positions = [];
let idx = -1;
while ((idx = phrase.indexOf("a", idx + 1)) !== -1) {
positions.push(idx);
}
console.log(positions); // [1, 4, 11, ...]Die Realität im Jahr 2026: includes() Und indexOf() bei booleschen Prüfungen nahezu identische Geschwindigkeit aufweisen — wählen Sie includes() der Übersichtlichkeit halber, es sei denn, Sie benötigen den Index.
3. Groß-/Kleinschreibung ignorierende Prüfungen (häufigster Anwendungsfall in der Praxis)
Für die Funktionen `includes()` und `indexOf()` gibt es kein natives Flag für die Groß-/Kleinschreibung.
Best Practice 2026: Groß-/Kleinschreibung vereinheitlichen
js
function containsIgnoreCase(text, term) {
if (text == null || term == null) return false;
return text.toLowerCase().includes(term.toLowerCase());
// Oder lokalisierungsfähig (für den Produktivbetrieb empfohlen):
// text.toLocaleLowerCase('en').includes(term.toLocaleLowerCase('en'));
}
console.log(containsIgnoreCase(phrase, "POWERFUL")); // trueWarum toLowerCase() gewinnt meistens
- Schneller als reguläre Ausdrücke bei der Suche nach exakten Zeichenfolgen
- Temporäre Strings sind in modernen GC-Systemen kostengünstig
- Vermeidet den Overhead durch die Kompilierung und Escape-Verarbeitung von regulären Ausdrücken
Hinweis zur Ländereinstellung — Türkisch ("I".toLowerCase() → "ı") oder andere Sprachen könnten überraschen. Verwenden Sie toLocaleLowerCase() mit expliziter Ländereinstellung, wenn es auf Internationalisierung ankommt.
Alternative mit regulären Ausdrücken (flexibel, aber langsamer)
js
function containsIgnoreCaseRegex(text, term) {
if (!term) return true;
// Sonderzeichen maskieren, wenn der Begriff vom Benutzer stammt
const escaped = term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
return new RegExp(escaped, 'i').test(text);
}Oder als Einzeiler (nur für vertraute Begriffe):
js /2026/i.test(phrase); // true
Wann sollte man Regex wählen?
- Wortgrenzen benötigt (
\bterm\b) - Wechsel (
Katze|Hund) - Lookarounds oder andere Muster
Tipp zur Leistungsoptimierung: Regulären Ausdruck kompilieren einmal außerhalb von Schleifen/Hot-Paths.
4. Weitere Methoden und wann man sie anwendet
String.prototype.search(regexp)
Gibt den Index der ersten Übereinstimmung zurück oder-1. Wird heute nur noch selten verwendet —includes()oder.test()sind klarer.String.prototype.match()/matchAll()
Zum Extrahieren von Übereinstimmungen, nicht nur zum Feststellen des Vorhandenseins.startsWith()/endsWith()(ES2015)
Spezielle Prüfungen – schneller bei Präfixen/Suffixen.
js
phrase.startsWith("Java"); // true
phrase.endsWith("fast"); // true5. Leistung der Motoren im Jahr 2026
Ungefähre relative Geschwindigkeiten (V8/Node 22+, große Zeichenfolge ~10.000 Zeichen, Literalsuche):
| Verfahren | Rel. Geschwindigkeit | Am besten für | Anmerkungen |
includes() wörtlich | 1.0× | Einfaches Ja/Nein | Die erste Wahl |
indexOf() | ~1,0–1,02× | Index oder mehrere Treffer erforderlich | Zur gleichen Familie wie |
toLowerCase() + includes() | 0.65–0.80× | Literal ohne Berücksichtigung der Groß-/Kleinschreibung | Zwei temporäre Zeichenfolgen, aber schnell |
/literal/i.test() | 0.25–0.45× | Groß-/Kleinschreibung ignorieren oder Begrenzungen | Regex-Overhead |
new RegExp(escaped, 'i').test() | 0.20–0.40× | Dynamische/bereinigte Eingabe | Escape-Kosten + Regex |
Das Wichtigste auf einen Blick: Verwenden Sie includes() für Literale. Die Groß-/Kleinschreibung wird für „ignore-case“ normalisiert, sofern keine Regex-Funktionen erforderlich sind. Regex ist 2–5-mal langsamer, aber akzeptabel, sofern keine engen Schleifen vorliegen.
6. Randfälle und Fallstricke (entscheidend im Jahr 2026)
includes("") → true(eine leere Teilzeichenfolge passt überall)null/undefinierthaystack/needle → TypeError- Ersatzpaare und Emojis → werden korrekt verarbeitet (UTF-16)
js "Hallo 🌍 2026".includes("🌍"); // true - Negativ
Position →als 0 behandelt - Sehr lange Zeichenfolgen → Suchmaschinen verwenden effiziente Algorithmen (durchschnittlich O(n))
- Benutzereingabe → niemals Reguläre Ausdrücke aus rohen Benutzerstrings ohne Escape-Zeichen erstellen
7. Produktionsassistenten und bewährte Vorgehensweisen
Null-sichere Hilfsfunktion (TypeScript-kompatibel):
ts
function contains(
haystack: string | null | undefined,
needle: string | null | undefined,
options: { ignoreCase?: boolean; from?: number } = {}
): boolean {
if (haystack == null || needle == null) return false;
const { ignoreCase = false, from = 0 } = options;
const h = ignoreCase ? haystack.toLowerCase() : haystack;
const n = ignoreCase ? needle.toLowerCase() : needle;
return h.includes(n, from);
}
// Usage
contains("JavaScript 2026", "script", { ignoreCase: true }); // trueEmpfehlungen für 2026
- Standardmäßig auf
includes()der Klarheit halber - Groß-/Kleinschreibung normalisieren statt reguläre Ausdrücke für einfache Ignorierung der Groß-/Kleinschreibung
- Cache-Regex-Muster
- Messen Sie reale Arbeitslasten (vermeiden Sie eine übermäßige Fixierung auf Mikro-Benchmarks)
- Verwende Bibliotheken (lodash
_.includes, Fuse.js) nur, wenn Sie eine unscharfe Suche oder erweiterte Suchfunktionen benötigen
Abschluss
Im Jahr 2026 ist die Überprüfung, ob eine Zeichenkette eine Teilzeichenkette enthält, in JavaScript nach wie vor ein auf den ersten Blick einfacher Vorgang, der durch hochoptimierte APIs ermöglicht wird. String.prototype.includes() ist nach wie vor die bevorzugte Wahl für die meisten Szenarien – sie bietet Klarheit, Leistung und eine aussagekräftige Lesbarkeit. Bei groß-/kleinschreibungsunabhängigen Prüfungen empfiehlt sich die Normalisierung mit toLowerCase() (oder gegebenenfalls lokalisierungsfähige Alternativen) bieten einen zuverlässigen und effizienten Ansatz. Reguläre Ausdrücke sollten für Situationen vorbehalten bleiben, die eine Flexibilität auf Musterebene erfordern, die über den wörtlichen Abgleich hinausgeht.
Häufige Muster, auf die sich Entwickler stützen:
- Literale Boolesche Prüfung →
str.includes(sub) - Mit Position/Index →
str.indexOf(sub) >= 0 - Groß-/Kleinschreibung ignorieren →
str.toLowerCase().includes(sub.toLowerCase()) - Komplexe Anforderungen → Zwischengespeichert
RegExp.test()
Die Wahl der geeigneten Methode und die Berücksichtigung von Randfällen – wie leere Werte, Null-Eingaben, Unicode-Verarbeitung und benutzergenerierte Daten – gewährleisten einen Code, der sowohl ausfallsicher als auch skalierbar ist.
Carmatec unterstützt Unternehmen dabei, leistungsstarke JavaScript-basierte Anwendungen zu entwickeln, bei denen die Beachtung solcher grundlegender Details direkt zur Zuverlässigkeit, Geschwindigkeit und Wartbarkeit im großen Maßstab beiträgt.