`Array#sort` must have a compare functionJS-0375
This rule prevents invoking the Array#sort()
method without providing a compare
argument.
When called without a compare function, Array#sort()
converts all non-undefined array elements into strings and then compares said strings based off their UTF-16 code units.
The result is that elements are sorted alphabetically, regardless of their type. When sorting numbers, this results in the classic "10 before 2" order:
[1, 2, 3, 10, 20, 30].sort(); //→ [1, 10, 2, 20, 3, 30]
This also means that Array#sort
does not always sort consistently, as elements may have custom #toString implementations that are not deterministic; this trap is noted in the noted in the language specification thusly:
NOTE 2: Method calls performed by the ToString abstract operations in steps 5 and 7 have the potential to cause SortCompare to not behave as a consistent comparison function. ttps://www.ecma-international.org/ecma-262/9.0/#sec-sortcompare
Bad Practice
const array: any[];
const stringArray: string[];
array.sort();
// String arrays should be sorted using `String#localeCompare`.
stringArray.sort();
Recommended
const array: any[];
const userDefinedType: { sort(): void };
array.sort((a, b) => a - b);
array.sort((a, b) => a.localeCompare(b));
userDefinedType.sort();