Поведение по умолчанию для Array.prototype.sort () в Javascript может не соответствовать вашим ожиданиям, если не предусмотрена функция сравнения.

Недавно мне нужно было отсортировать массив целых чисел в Javascript в порядке возрастания, и я достиг Array.prototype.sort().

const array = [0, 2, 1, -2, -1]
array.sort()
//expected result: [-2, -1, 0, 1, 2]

Я использовал эту функцию много раз и никогда не сталкивался с какими-либо проблемами. Я знаю, что вы можете передать функцию сравнения в качестве необязательного параметра для настройки поведения сортировки, то есть array.sort([compareFunction]). Но для простых старых целых чисел сортировки по возрастанию предположение было излишним.

Как я был неправ! Значение array после сортировки было:

[ -1, -2, 0, 1, 2 ]

Пора обратиться к официальной документации:

По умолчанию используется возрастающий порядок сортировки, основанный на преобразовании элементов в строки и последующем сравнении их последовательностей значений кодовых единиц UTF-16.

Получается, что без явной функции сравнения Javascript будет обрабатывать все элементы массива как строки! Тот факт, что массив содержит только данные типа number, очевиден. Это действительно имеет смысл, поскольку Javascript - динамический язык. Он не просит вас объявить тип данных для массива при объявлении, чтобы он не знал о вашем намерении. Каждый элемент в массиве может относиться к любому типу данных, поэтому Javascript должен работать с наименьшим общим знаменателем.

Как только все стало ясно, исправить это было действительно очень просто. Вот как правильно отсортировать массив чисел в Javascript по возрастанию:

const array = [0, 2, 1, -2, -1]
array.sort((a, b) => a - b)
//[-2, -1, 0, 1, 2]

Вы раньше сталкивались с таким поведением?