> Что должен возвращать колбэк в методе 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);// Безопасный компаратор для чисел с NaNfunction 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и отсутствие сортировки
> Похожие задачи по frontend
Как собрать неопределённое количество аргументов функции в JavaScript и работать с ними
Каков порядок выполнения синхронных задач, микротасков и макротасков в JavaScript
Почему async функция возвращает Promise
В чем разница между строгим и нестрогим сравнением в JavaScript и почему лучше использовать строгое?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью