Start · Sprachen · JavaScript · Referenz · String.prototype.localeCompare()

String.prototype.localeCompare()

Methode

Vergleicht zwei Zeichenketten sprachabhängig und gibt eine negative Zahl, 0 oder eine positive Zahl zurück, je nachdem ob der String davor, gleich oder danach einsortiert wird.

seit JavaScript ES3 (locales/options: ECMA-402, Baseline: alle Bro Kategorie: method-property

Signatur

String.prototype.localeCompare(compareString, locales, options)

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

Typ
number
Beschreibung
Eine negative Zahl, wenn der String vor 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
-1 -1 false

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());
[ 'anna', 'Bernd', 'Émile', 'Ömer', 'Zoe' ] [ 'Bernd', 'Zoe', 'anna', 'Émile', 'Ömer' ]

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);
[ 'bild1.png', 'bild2.png', 'bild10.png' ]

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'));
true true true

// Wichtig · Fallstricke

  • Nur das Vorzeichen prüfen: Nie auf === -1 oder === 1 testen – manche Engines liefern andere Beträge. Immer < 0, > 0 oder === 0 verwenden.
  • Performance: Bei jedem Aufruf mit locales/options muss die Engine intern die Kollationsdaten nachschlagen. Für große Arrays besser einmal const coll = new Intl.Collator('de', { numeric: true }) anlegen und arr.sort(coll.compare) nutzen – das ist deutlich schneller.
  • Locale immer angeben: Ohne locales hä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 locales und options ist in allen modernen Browsern und in Node.js (mit vollständigem ICU, Standard seit Node.js 13) vorhanden. Ungültige Locale-Tags werfen einen RangeError.