Signatur
Beschreibung
localeCompare() vergleicht die aufrufende Zeichenkette mit compareString nach den Sortierregeln einer Sprache (Kollation). Das Ergebnis ist negativ, wenn der String vorher einsortiert wird, positiv, wenn er danach kommt, und 0, wenn beide als gleichwertig gelten.
Im Gegensatz zu den Operatoren < und >, die nur UTF-16-Codeeinheiten vergleichen, berücksichtigt localeCompare() Umlaute, Akzente, Groß-/Kleinschreibung und sprachspezifische Regeln. Damit ist die Methode die richtige Wahl als Vergleichsfunktion für Array.prototype.sort(), wenn Namen, Städte oder andere für Menschen lesbare Texte sortiert werden sollen: Aus "Ärger" wird im Deutschen korrekt ein Eintrag bei „A“ statt hinter „Z“.
Über die Parameter locales und options lässt sich das Verhalten genau steuern, z. B. sensitivity: "base" für Vergleiche ohne Beachtung von Akzenten und Groß-/Kleinschreibung oder numeric: true für eine „natürliche“ Sortierung, bei der "Datei10" hinter "Datei2" kommt. Die Parameter entsprechen denen des Intl.Collator-Konstruktors.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $compareString Pflicht | string | Die Zeichenkette, mit der verglichen wird. Andere Werte werden in einen String umgewandelt; fehlt das Argument, wird mit "undefined" verglichen. |
|
| $locales | string | string[] | undefined | Standard-Locale der Laufzeitumgebung | BCP-47-Sprachcode(s), z. B. "de", "sv" oder ["de-DE", "en"]. Auch Unicode-Erweiterungen wie "de-u-co-phonebk" (Telefonbuch-Sortierung) sind möglich. |
| $options | Intl.CollatorOptions | {} | Objekt mit Vergleichsoptionen: sensitivity ("base", "accent", "case", "variant"), numeric (boolean), caseFirst ("upper", "lower", "false"), ignorePunctuation (boolean), usage ("sort" oder "search"). |
Rückgabewert
compareString einsortiert wird, eine positive Zahl, wenn er danach kommt, und 0 bei Gleichwertigkeit. Der genaue Betrag (z. B. -1 oder -2) ist nicht festgelegt.Beispiele
Einfacher Vergleich mit Umlauten
console.log('a'.localeCompare('b', 'de'));
console.log('Ärger'.localeCompare('Zebra', 'de'));
console.log('Ärger' < 'Zebra'); // reiner Codeeinheiten-Vergleich
Namensliste korrekt auf Deutsch sortieren
const namen = ['Zoe', 'Ömer', 'anna', 'Émile', 'Bernd'];
const sortiert = [...namen].sort((a, b) => a.localeCompare(b, 'de'));
console.log(sortiert);
// Zum Vergleich: Standard-sort() nach Codeeinheiten
console.log([...namen].sort());
Natürliche Sortierung von Dateinamen
const dateien = ['bild10.png', 'bild2.png', 'bild1.png'];
dateien.sort((a, b) => a.localeCompare(b, 'de', { numeric: true }));
console.log(dateien);
Vergleich ohne Groß-/Kleinschreibung und Akzente
const gleich = (a, b) =>
a.localeCompare(b, 'de', { sensitivity: 'base' }) === 0;
console.log(gleich('Café', 'cafe'));
console.log(gleich('Straße', 'STRASSE'));
console.log(gleich('Müller', 'Muller'));
// Wichtig · Fallstricke
- Nur das Vorzeichen prüfen: Nie auf
=== -1oder=== 1testen – manche Engines liefern andere Beträge. Immer< 0,> 0oder=== 0verwenden. - Performance: Bei jedem Aufruf mit
locales/optionsmuss die Engine intern die Kollationsdaten nachschlagen. Für große Arrays besser einmalconst coll = new Intl.Collator('de', { numeric: true })anlegen undarr.sort(coll.compare)nutzen – das ist deutlich schneller. - Locale immer angeben: Ohne
localeshängt das Ergebnis von der Systemsprache des Nutzers bzw. Servers ab, was zu unterschiedlichen Sortierungen führen kann (z. B. ordnet Schwedisch „ä“ hinter „z“ ein). - Ergebnisse können sich zwischen Browsern und Versionen minimal unterscheiden, da sie auf den ICU-Daten der jeweiligen Engine basieren. Nicht für sicherheitsrelevante oder exakte Gleichheitsprüfungen (z. B. Passwörter, IDs) verwenden – dafür
===nutzen. - Die Unterstützung von
localesundoptionsist in allen modernen Browsern und in Node.js (mit vollständigem ICU, Standard seit Node.js 13) vorhanden. Ungültige Locale-Tags werfen einenRangeError.