Что должен возвращать колбэк в методе sort в JavaScript
Что проверяют
Знаете ли вы контракт функции сравнения и типовые ошибки с ним.
Как отвечать
Функция сравнения должна возвращать число:
- отрицательное, если первый аргумент должен стоять раньше второго;
- положительное, если раньше должен стоять второй;
- ноль, если порядок между ними не важен.
numbers.sort((a, b) => a - b); // по возрастанию
numbers.sort((a, b) => b - a); // по убываниюТри типовые ошибки:
1. Возврат логического значения. Запись со сравнением через оператор больше выглядит естественно, но работает неправильно: истина приводится к единице, ложь к нулю, а отрицательного значения не получается никогда. Сортировка становится неверной, причём на коротких массивах может случайно давать правильный результат, что маскирует ошибку.
2. Отсутствие функции сравнения. Без неё элементы приводятся к строкам и сортируются посимвольно. Отсюда знаменитый результат, где десятка оказывается между единицей и двойкой. Для чисел функция сравнения обязательна всегда.
3. Вычитание для строк. Оно даст не число, поэтому для строк используют встроенное сравнение с учётом языка, которое правильно обрабатывает регистр, буквы с диакритикой и особенности алфавита.
Что ещё стоит знать:
- метод изменяет исходный массив и возвращает его же, а не копию. Если исходный нужен, есть современный вариант, возвращающий новый массив;
- сортировка устойчива по спецификации, то есть равные элементы сохраняют относительный порядок. На этом строится сортировка по нескольким полям последовательными проходами;
- функция сравнения должна быть согласованной: если она даёт противоречивые ответы, результат не определён. Случайное значение внутри неё для перемешивания массива не подходит.
Где спотыкаются
Возвращают результат сравнения вместо числа.
Сортируют числа без функции сравнения.
Не замечают, что исходный массив изменился.
Перемешивают массив случайной функцией сравнения.