Array.prototype.sort() 默认按字符串 Unicode 码点排序,数字数组需传入比较函数如 (a, b) => a - b;字符串可按长度、字母序(localeCompare 更可靠);对象数组需处理空值和类型不一致问题,并注意 sort() 会原地修改数组。

Array.prototype.sort() 默认按字符串 Unicode 码点排序,直接调用 sort() 对数字数组排序会得到错误结果,比如 [10, 2, 33] 变成 [10, 2, 33](因为 "10" 为 true)。
为什么数字数组用 sort() 会乱序?
JavaScript 的 sort() 不做类型推断,所有元素被强制转为字符串再比较。数字 10 转成 "10",2 转成 "2",而 "10".charCodeAt(0) === 49,"2".charCodeAt(0) === 50,所以 "10" 成立——这显然不是你想要的数值顺序。
解决方式只有一个:传入比较函数。
比较函数怎么写才对?
比较函数接收两个参数 a 和 b,返回值决定排序逻辑:
立即学习“Java免费学习笔记(深入)”;
- 返回负数 →
a排在b前面 - 返回 0 →
a和b位置不变(相对顺序保留) - 返回正数 →
a排在b后面
最常用写法是 (a, b) => a - b(升序),或 (a, b) => b - a(降序)。注意:这个技巧只适用于安全整数范围内的数字,且不处理 NaN 或非数字值。
更健壮的写法(兼容非数字、null、undefined):
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
arr.sort((a, b) => {
if (a == null) return 1;
if (b == null) return -1;
return Number(a) - Number(b);
});字符串数组如何按长度或字母序排序?
默认就是按字母序(Unicode),但大小写敏感:["Apple", "banana", "cherry"] 排完可能是 ["Apple", "banana", "cherry"](因为大写字母码点更小)。需要忽略大小写时用 localeCompare:
- 字母序(忽略大小写):
(a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }) - 按长度升序:
(a, b) => a.length - b.length - 先按长度、再按字典序:
(a, b) => a.length - b.length || a.localeCompare(b)
localeCompare 比 String.prototype.toLowerCase() 更可靠,它能正确处理德语 ä、西班牙语 ñ 等本地化字符。
对象数组按某个属性排序容易踩哪些坑?
常见错误是没处理属性不存在或类型不一致的情况。比如:
users.sort((a, b) => a.age - b.age); // 若某项没有 age,结果是 NaN,整个排序行为不可预测
稳妥做法:
- 用空值合并操作符提供默认值:
(a, b) => (a.age ?? 0) - (b.age ?? 0) - 或提前过滤/校验:
users.filter(u => typeof u.age === 'number').sort(...) - 多级排序(如先按
status,再按name):用||链式判断,确保前一级相等时才比下一级
另外注意:sort() 是原地修改,会改变原数组。如果不想污染原始数据,记得先 slice() 或展开:[...arr].sort(...)。
真正麻烦的从来不是怎么写比较函数,而是忘记检查数据质量——空值、类型混杂、嵌套层级变化,这些都会让看似正确的函数突然失效。










