sort()默认按字符串Unicode码点排序而非数值大小,如[10,2]排为[10,2];数字、对象、中文等类型必须显式传入比较函数。
![如何识别 sort() 的默认排序逻辑:为什么 [10, 2].sort() 结果不符合预期](https://img.php.cn/upload/article/001/242/473/177848728881804.png)
因为 sort() 默认把每个元素转成字符串,再按 Unicode 码点逐字符比较,不是按数字大小比。
默认行为是字符串化后字典序比较
调用 [10, 2].sort() 时,JavaScript 内部会先执行 String(10) → "10",String(2) → "2",然后比较 "10" 和 "2" 的首字符:"1"(U+0031)比 "2"(U+0032)小,所以 "10" 排在前面,结果是 [10, 2]。
类似情况还有:
-
['Apple', 'apple']→['Apple', 'apple'](大写 A 的 Unicode 小于小写 a) -
[undefined, 1, null]→ 转为"undefined"、"1"、"null"后排序 -
['10', '2', '1']→ 字符串排序得['1', '10', '2'],而非数值顺序
怎么快速判断当前是否触发了默认逻辑
出现以下任一现象,大概率是没传比较函数,走的是默认字符串排序:
- 数字数组排出来像
[1, 10, 2, 20]这样“乱序” - 大小写混排时,大写字母全在小写前(如
Banana在apple前) - 含空值或特殊类型(
null、undefined、NaN)的数组排序后位置反直觉
验证默认逻辑的简单方法
手动模拟一遍转换和比较过程:
- 对每个元素调用
String(),看转成什么字符串 - 拿两个字符串用
localeCompare()测试:例如"10".localeCompare("2")返回负数,说明"10"排前面 - 观察浏览器控制台输出,比如
console.log([10, 2].map(String))→["10", "2"]
不想被默认逻辑坑,记住这个底线
只要不是纯英文小写字符串且不区分大小写的需求,就别依赖默认行为。数字、对象、中文、日期、混合类型——全都要显式传比较函数。

















