JavaScript中sort()默认按Unicode码点字符串排序,数字数组需传入比较函数:升序用a-b,降序用b-a,对象按属性排序需自定义逻辑,中文等国际化文本应使用localeCompare。

JavaScript 中 sort() 方法默认按字符串 Unicode 码点排序,直接调用数字数组会得到错误结果(比如 [10, 2, 33] 排成 [10, 2, 33]),必须传入比较函数才能正确排序数字或自定义逻辑。
数字升序:用 (a, b) => a - b
这是最常用也最简洁的写法。返回值小于 0,a 排在 b 前;大于 0,b 排在 a 前;等于 0,顺序不变。
-
[5, 1, 9, 3].sort((a, b) => a - b)→[1, 3, 5, 9] - 注意:它会**原地修改**原数组,不返回新数组
- 如果想保留原数组,先用
slice()或展开运算符复制:[...arr].sort(...)
数字降序:用 (a, b) => b - a
和升序逻辑相反,只需交换减数和被减数。
-
[5, 1, 9, 3].sort((a, b) => b - a)→[9, 5, 3, 1] - 同样适用于负数、小数,比如
[-2.5, 0, 1.7].sort((a, b) => b - a)→[1.7, 0, -2.5]
按对象属性排序:传入带逻辑的比较函数
比如按用户年龄升序,或按姓名字母顺序排列。
立即学习“Java免费学习笔记(深入)”;
- 按 age 升序:
users.sort((a, b) => a.age - b.age) - 按 name 字母序(忽略大小写):
users.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())) - 先按 type 分组再按 price 降序:
items.sort((a, b) => a.type.localeCompare(b.type) || b.price - a.price)
字符串排序要注意 localeCompare
直接用 sort() 对中文、带重音符号的字母(如 é, ñ)可能出错。推荐用 localeCompare 替代 > 或 比较。
- 安全的字母序:
['香蕉', '苹果', '橙子'].sort((a, b) => a.localeCompare(b)) - 支持语言选项,比如按中文拼音排:
words.sort((a, b) => a.localeCompare(b, 'zh')) - 区分大小写?加选项:
a.localeCompare(b, undefined, { sensitivity: 'base' })
基本上就这些。记住核心:不传函数 → 字符串排序;数字/对象/多条件 → 写比较函数;中文或国际化文本 → 优先用 localeCompare。











