Когда дело доходит до реализации Array.sort
, вы также должны спросить, какой движок? Они не все равны с точки зрения , как они в конечном итоге попадают в окончательную sorted
версию массива. Например, V8
имеет этап предварительной обработки и последующей обработки перед any
сортировкой:
V8 имеет один шаг предварительной обработки, прежде чем он на самом деле что-то сортирует и
также один шаг постобработки. Основная идея состоит в том, чтобы собрать все
неопределенные значения во временный список, сортируйте этот временный список
а затем записать отсортированные значения обратно в фактический массив или объект.
Это освобождает V8 от заботы о взаимодействии с аксессуарами или
Прототип цепи при самой сортировке.
Вы можете найти довольно подробное объяснение всего процесса V8
проходит здесь
Фактический исходный код для сортировки V8 (с использованием Timsort ) может быть найден здесь и теперь находится на языке Torque .
JS тесты для V8 Array.sort
могут быть здесь видно
Суть в том, что на самом деле ничего не удаляется из исходного массива, поскольку этого не должно быть. Сортировка не должна mutate
исходный массив. Это было бы супер weird
, если вы позвоните myArray.sort()
, и вдруг у него будет на 5 элементов меньше, чем из 8 (например). Это не то, что вы найдете в любых Array.sort
спецификациях.
Также Array.sort
уделяет пристальное внимание сортируемым типам и заказывает их специально. Пример:
let arr = [4,2,5,,,,3,false,{},undefined,null,0,function(){},[]]
console.log(arr.sort())
Обратите внимание на вывод выше, как сначала array
, затем значения numeric
, object literal
, Boolean
, function
, null
, а затем undefined
/ empty
. Поэтому, если вы хотите действительно соответствовать спецификации, вам следует подумать о том, как сортируются разные типы.