默认按字符串排序导致数值乱序,如[10,2,33,1]变为[1,10,2,33];因数字转字符串后依首字符Unicode值比较,而非数值大小。

当你对数字数组调用 sort() 却没传比较函数,结果看起来“乱序”,大概率就是掉进了默认字符串转换排序的坑。
看输出是否符合字典序而非数值大小
比如 [10, 2, 33, 1] 执行 .sort() 后得到 [1, 10, 2, 33],而不是预期的 [1, 2, 10, 33]。这是因为每个数字被转成字符串后,按首字符 Unicode 值排:“1”
检查数组是否含非纯数字类型
哪怕混入一个字符串数字(如 ['10', 2, '3']),或 null、undefined,sort 也会统一转成字符串比较:"null"、"undefined"、"10"、"2" —— 它们的首字母决定了顺序,完全脱离数值逻辑。如果排序后看到 null 或 undefined 出现在中间或开头,也是典型信号。
对比大小写敏感的字符串排序结果
对 ['apple', 'Banana', 'cherry'] 直接 .sort(),结果是 ['Banana', 'apple', 'cherry']。因为大写 B 的 Unicode 值(66)小于小写 a(97)。这种“大写字母排前面”的反直觉现象,和数字错乱本质相同,都是字符串化 + Unicode 比较的直接体现。
用 typeof 或 Number.isFinite 快速验证
运行一下简单检测:
const arr = [10, 2, 33]; console.log(arr.map(x => typeof x)); // ['number', 'number', 'number'] console.log(arr.every(Number.isFinite)); // true // ✅ 全是有效数字,但 sort() 还是错 → 铁证是默认字符串排序
如果类型没问题,排序却不对,那几乎可以确定:你没传比较函数,引擎正在默默做字符串转换。










