> Что должен возвращать колбэк в методе sort в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: ADV/web-engineering, ITFB, Домклик

Стек: JavaScript

> Пример ответа

Короткий ответ

Колбэк в sort должен возвращать число: отрицательное, если первый аргумент должен идти раньше второго, положительное - если позже, и ноль, если порядок не важен. Это контракт функции сравнения, и он работает для любых типов данных, если вы корректно приводите их к числовому результату.

Подробное объяснение

Метод Array.prototype.sort ожидает функцию-компаратор с сигнатурой (a, b) => number. Возвращаемое значение интерпретируется так:

  • < 0 - a ставится перед b
  • > 0 - b ставится перед a
  • === 0 - относительный порядок сохраняется (стабильность гарантирована в современном стандарте)

Важно: возвращать нужно именно число, а не булево значение. Распространённая ошибка - return a > b, что возвращает true/false, которые приводятся к 1/0. Это ломает сортировку, потому что при равенстве возвращается 0, но при a < b тоже возвращается 0 вместо отрицательного числа - алгоритм считает элементы равными и не меняет их порядок.

Для чисел корректный компаратор - (a, b) => a - b (по возрастанию) или (b - a) (по убыванию). Для строк - localeCompare или сравнение через if/else. Для объектов - сравнение по нужному полю.

На практике

На senior-позиции важно не просто написать a - b, но и понимать edge cases:

  • NaN: при a - b с NaN результат всегда NaN, который трактуется как 0 - элементы с NaN останутся на месте. Если нужно детерминированное поведение, обрабатывайте явно.
  • Большие числа: a - b может переполнить Number для BigInt или чисел за пределами безопасного диапазона - используйте явные сравнения.
  • Стабильность: современный sort стабилен (ES2019+), но если вы пишете свой компаратор, не полагайтесь на порядок при равенстве - это не гарантировано в старых движках.
  • Мутация: sort сортирует на месте, возвращая ту же ссылку. Для иммутабельности копируйте массив перед сортировкой.

Пример кода

JAVASCRIPT
// Числа по возрастанию
[3, 1, 2].sort((a, b) => a - b); // [1, 2, 3]
// Числа по убыванию
[3, 1, 2].sort((a, b) => b - a); // [3, 2, 1]
// Строки с учётом локали
['ä', 'b', 'a'].sort((a, b) => a.localeCompare(b)); // ['a', 'ä', 'b']
// Объекты по полю
const users = [{ age: 30 }, { age: 20 }];
users.sort((a, b) => a.age - b.age);
// Безопасный компаратор для чисел с NaN
function safeCompare(a, b) {
if (Number.isNaN(a)) return 1;
if (Number.isNaN(b)) return -1;
return a - b;
}
// Иммутабельная сортировка
const sorted = [...arr].sort((a, b) => a - b);

Как отвечать на собеседовании

Начните с точного контракта: отрицательное, ноль, положительное. Затем покажите понимание, почему return a > b - ошибка. Упомяните стабильность сортировки и мутацию массива. Если спросят про производительность - скажите, что компаратор вызывается O(n log n) раз, поэтому тяжёлые вычисления в нём лучше кэшировать (decorate-sort-undecorate паттерн). Для senior важно показать, что вы знаете не только синтаксис, но и подводные камни.

Что проверяет интервьюер

  • Понимание контракта функции сравнения, а не заучивание a - b
  • Умение объяснить, почему булево значение не подходит
  • Знание особенностей: NaN, стабильность, мутация
  • Способность предложить корректный компаратор для нечисловых данных
  • Понимание сложности и оптимизаций

Типичные ошибки

  • Возврат true/false вместо числа - сортировка работает непредсказуемо
  • Забывают про localeCompare для строк с учётом локали - получают неправильный порядок для ä, ö, ü
  • Сортируют объекты без указания поля - получают [object Object] строковое сравнение
  • Не учитывают, что sort мутирует исходный массив
  • Пишут return a - b для строк - получают NaN и отсутствие сортировки

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью