โก sort() Isn’t Sorting Numbers the Way You Think
Calling .sort() on an array of numbers with no arguments doesn’t sort numerically — it converts every number to a string first and compares them alphabetically, and nothing throws an error to warn you it happened.
๐ The Problem
const values = [10, 1, 2, 21, 100]; values.sort(); console.log(values); // [ 1, 10, 100, 2, 21 ] <- NOT numerically sorted at all // "10" alphabetically comes before "2" because '1' < '2', // exactly like a word starting with "1" beats one starting with "2".
๐ Why This Happens
Array.prototype.sort() with no comparator converts every element to a string and sorts by UTF-16 code unit order - i.e. alphabetical order. It was designed this way because sort() has to work for ANY array (strings, mixed types, objects), so it needs a universal default - numeric order was never it.
โ The Fix: Always Pass a Comparator for Numbers
- (a, b) => a – b sorts ascending; (a, b) => b – a sorts descending.
- There is no safe way to sort numbers correctly with the zero-argument form — always pass the comparator, every time, without exception.
๐ข Correct Version
const values = [10, 1, 2, 21, 100]; values.sort((a, b) => a - b); console.log(values); // [ 1, 2, 10, 21, 100 ] - correct
โ ๏ธ This Bug Hides Especially Well When
- All your test data happens to be single-digit or already-ordered numbers — the bug is invisible until a two-digit value sorts against a one-digit one.
- You’re sorting an array of objects by a numeric property using .sort((a, b) => a.value – b.value) is correct; forgetting the subtraction and comparing raw values isn’t.
A one-argument fix for a bug that only shows up once your data has more than nine of something — which is exactly the kind of bug that passes code review and fails in production.
