Learn JavaScript

localeCompare() - метод для сравнения строк с учётом локали в JavaScript

localeCompare() сравнивает две строки с учётом правил языка и локали.

Этот метод особенно полезен, когда строки нужно сортировать “по-человечески”, а не просто сравнивать по кодам символов.

Синтаксис

str.localeCompare(compareString)
str.localeCompare(compareString, locales)
str.localeCompare(compareString, locales, options)

Метод вызывается у строки и возвращает число.

Что возвращает localeCompare()

Результат показывает порядок строк:

  • отрицательное число, если текущая строка должна идти раньше
  • 0, если строки считаются равными
  • положительное число, если текущая строка должна идти позже
console.log("a".localeCompare("b")); // отрицательное число
console.log("a".localeCompare("a")); // 0
console.log("b".localeCompare("a")); // положительное число

Важно: не стоит рассчитывать именно на -1 и 1. Надёжно проверять только знак числа.

Как работает localeCompare()

console.log("apple".localeCompare("banana")); // отрицательное число
console.log("banana".localeCompare("apple")); // положительное число

Метод не возвращает true или false, а именно число для сравнения и сортировки.

Когда это полезно

localeCompare() удобно использовать, когда:

  • нужно отсортировать строки
  • важны правила конкретного языка
  • нужно сравнивать строки “по-человечески”

Пример:

const words = ["banana", "apple", "cherry"];

words.sort((a, b) => a.localeCompare(b));

console.log(words); // ["apple", "banana", "cherry"]

Локаль

Во втором аргументе можно указать локаль.

console.log("ä".localeCompare("z", "de"));
console.log("ä".localeCompare("z", "sv"));

Для разных языков порядок символов может отличаться, поэтому локаль иногда влияет на результат сортировки.

Опции сравнения

В третьем аргументе можно передать настройки сравнения.

Одна из самых полезных опций - sensitivity.

console.log("e".localeCompare("é", "ru", { sensitivity: "base" }));    // 0
console.log("e".localeCompare("é", "ru", { sensitivity: "variant" })); // не 0

С base различия вроде регистра и акцентов могут игнорироваться. С variant сравнение становится более строгим.

Числовая сортировка

По умолчанию строки "2" и "10" сравниваются как текст.

console.log("2".localeCompare("10")); // положительное число

Это происходит потому, что "2" и "10" воспринимаются как строки, а не числа.

Если нужна “человеческая” числовая сортировка, можно использовать опцию numeric.

console.log("2".localeCompare("10", "en", { numeric: true })); // отрицательное число

Это удобно, например, для сортировки версий, номеров и строк с числами.

localeCompare() и sort()

Очень частый сценарий - сортировка массива строк.

const items = ["яблоко", "банан", "апельсин"];

items.sort((a, b) => a.localeCompare(b, "ru"));

console.log(items);

Именно в связке с sort() этот метод используют чаще всего.

localeCompare() и обычное сравнение

Иногда строки сравнивают через < и >, но для сортировки текста на разных языках это не всегда лучший вариант.

const a = "яблоко";
const b = "банан";

console.log(a < b);
console.log(a.localeCompare(b, "ru"));

Для простых технических сравнений обычных ASCII-строк операторов может хватить, но для пользовательского текста localeCompare() обычно надёжнее.

Частые ошибки

Ожидать только -1, 0 или 1

console.log("a".localeCompare("b"));

Метод гарантирует отрицательное, ноль или положительное число, но не обязательно именно -1 и 1.

Использовать localeCompare() как boolean

const result = "a".localeCompare("b");
console.log(result); // отрицательное число

Это не булево значение. Метод предназначен именно для сравнения порядка строк.

Забывать про локаль и настройки

const items = ["2", "10"];

items.sort((a, b) => a.localeCompare(b));

Если ожидается числовой порядок, лучше явно передать numeric: true.

Быстрая памятка

  • localeCompare() сравнивает строки с учётом локали
  • метод возвращает отрицательное число, 0 или положительное число
  • его часто используют внутри sort()
  • можно передать локаль и опции сравнения
  • для строк с числами полезна опция numeric: true

Коротко

localeCompare() - это метод строки в JavaScript для сравнения строк по правилам конкретного языка. Он особенно удобен для сортировки текста, когда важны локаль, регистр, акценты и корректный порядок строк с числами.