JavaScript数组sort()默认按字符串Unicode排序,数字排序需传入比较函数如(a,b)=>a-b;对象按字段排序用a.field-b.field或localeCompare;推荐扩展运算符生成新数组以避免副作用。

JavaScript 中数组排序主要靠 sort() 方法,但它默认按字符串 Unicode 码点排序,直接用于数字会出错;优化排序关键在于正确传入比较函数,并结合业务场景选择稳定、高效的方式。
数字数组排序必须写比较函数
sort() 默认把元素转成字符串再比对,所以 [10, 2, 33, 1] 会排成 [1, 10, 2, 33](因为 "1"
- 升序:
arr.sort((a, b) => a - b) - 降序:
arr.sort((a, b) => b - a) - 避免副作用:比较函数应是纯函数,不修改原数组或外部状态
对象数组按字段排序需提取值再比较
比如按用户年龄排序:users = [{name:'Alice', age:32}, {name:'Bob', age:25}],可这样写:
- 升序:
users.sort((a, b) => a.age - b.age) - 字符串字段(如 name)注意大小写:
users.sort((a, b) => a.name.localeCompare(b.name)) - 多级排序(先按 age 升序,age 相同再按 name 字母序):
users.sort((a, b) => a.age - b.age || a.name.localeCompare(b.name))
保持稳定性与性能的实用建议
ES2019 起,Array.prototype.sort() 在多数引擎中已是稳定排序(相同值的相对位置不变),但仍有例外。若需强保障或处理大数据量:
立即学习“Java免费学习笔记(深入)”;
- 对原始索引打标再排序,避免多次取值开销(尤其 getter 或计算属性)
- 大数据量(如 >10 万项)考虑分块排序或 Web Worker 避免阻塞主线程
- 频繁排序同一数组时,可缓存排序结果或用
slice().sort()避免污染原数组
替代方案:用扩展运算符 + sort 更安全
直接调用 arr.sort() 会修改原数组。习惯上更推荐生成新数组:
const sorted = [...arr].sort((a, b) => a - b)- 配合链式操作:
arr.filter(...).map(...).sort(...)更易读且不可变 - TypeScript 用户建议给比较函数标注参数类型,避免
any导致隐式转换错误
不复杂但容易忽略。写对比较函数,选对调用方式,排序就稳了。










