JavaScript sort()默认按Unicode码点排序,数字或对象排序必须传比较函数:数字用a-b升序、b-a降序;字符串用localeCompare()忽略大小写;对象按属性提取值后比较,多级排序需嵌套判断;sort()原地修改数组,需拷贝避免副作用。

JavaScript 的 sort() 方法默认按字符串 Unicode 码点排序,直接用于数字或复杂对象时容易出错。要实现可靠、可控的排序,必须传入一个比较函数(comparator)。
数字数组升序/降序排序
对纯数字数组排序时,不能直接写 arr.sort(),否则 [10, 2, 33] 会变成 [10, 2, 33](因为被转成字符串比较)。正确做法是用比较函数返回差值:
- 升序:用
a - b—— 小的在前 - 降序:用
b - a—— 大的在前
例如:[10, 2, 33].sort((a, b) => a - b) → [2, 10, 33][10, 2, 33].sort((a, b) => b - a) → [33, 10, 2]
字符串忽略大小写排序
默认排序中 'Z' 会排在 'a' 前面(因为 Unicode 中大写字母码点更小)。若想按字母顺序不区分大小写,可统一转为小写再比较:
arr.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))- 推荐用
localeCompare()而非===或减法,它支持语言敏感排序(如中文、带重音符号的字符)
对象数组按属性排序
对对象数组排序,关键是从每个对象中提取用于比较的值。注意处理 null、undefined 或缺失字段的情况:
- 按数字属性(如
age)升序:users.sort((a, b) => (a.age || 0) - (b.age || 0)) - 按字符串属性(如
name)升序:users.sort((a, b) => String(a.name).localeCompare(String(b.name))) - 多级排序(先按
status,再按name):items.sort((a, b) => {<br> if (a.status !== b.status) return a.status.localeCompare(b.status);<br> return a.name.localeCompare(b.name);<br> })
稳定排序与原地修改注意事项
sort() 是**原地修改**方法,会直接改变原数组,不返回新数组。如需保留原数组,应先拷贝:
- 浅拷贝可用展开运算符:
[...arr].sort(...) - ES2019+ 可用
toSorted()(返回新数组,不修改原数组),但兼容性需留意 - 浏览器原生
sort()在多数引擎中已是稳定排序(相同元素相对位置不变),但不要依赖它做“二次排序”逻辑,显式处理更可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











