Как работает sort() в JS: что скрыто под капотом 🚛

Array.prototype.sort() - это не просто сортировка элементов. Под капотом работает сложный механизм с абстрактными операциями, которые определяют поведение метода.

Алгоритм начинается с проверки компаратора и преобразования массива в объект. Затем собираются индексированные свойства с учётом стратегии обработки дыр - пропуск несуществующих элементов или чтение их как undefined. Это важно для разреженных массивов (где есть пропуски в индексах).

Сравнение элементов происходит через абстрактную операцию CompareArrayElements. Здесь интересная деталь: undefined всегда больше любого другого значения и отправляется в конец массива. Если компаратор возвращает NaN, он обрабатывается как ноль - элементы считаются равными и сохраняют свой порядок.

Компаратор может возвращать не только -1, 0 и 1, а любые числа. Алгоритм интерпретирует отрицательные числа как «первый элемент меньше», положительные как «первый элемент больше», а ноль как «равны». Это означает, что можно возвращать разность напрямую, дробные числа или любые вычисления - главное, чтобы знак был правильным.

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

После сортировки отсортированные элементы записываются обратно в массив, а оставшиеся индексы удаляются. Это сохраняет длину массива и убирает дыры, которые были пропущены при сортировке.

Всё это происходит in-place - исходный массив изменяется, а метод возвращает ссылку на тот же объект. Никаких копий, никаких дополнительных массивов - только перестановка элементов в существующей структуре. #js #сортировка #база

Как работает sort() в JS: что скрыто под капотом 🚛 | Сетка — социальная сеть от hh.ru