一、sort()
的默认行为
[10, 2, 1].sort(); // 默认排序 → 输出 [1, 10, 2] ❌ 不符合数字大小顺序
- 原因:
sort()
会将元素转换为字符串后,按 Unicode 码点顺序 排序。 - 结果不符合数值大小顺序。
对非 ASCII 字符的排序:
["Banana", "Apple", "Cherry"].sort();
// 输出 ["Apple", "Banana", "Cherry"] ✅(按字母顺序)
二、自定义排序规则
通过传递一个 比较函数(Comparator Function),可以控制排序逻辑。
1. 数字升序排序
const arr = [3, 1, 4, 2];
arr.sort((a, b) => a - b); // 输出 [1, 2, 3, 4] ✅
- 比较函数规则:
- 如果
a - b < 0
→a
排在b
前面(升序)。 - 如果
a - b > 0
→b
排在a
前面(升序)。 - 如果
a - b = 0
→ 顺序不变。
- 如果
2. 数字降序排序
arr.sort((a, b) => b - a); // 输出 [4, 3, 2, 1] ✅
三、其他场景示例
1. 对象数组排序
按对象的某个属性排序:
const users = [
{ name: "John", age: 25 },
{ name: "Alice", age: 30 },
{ name: "Bob", age: 20 }
];
// 按 age 升序排序
users.sort((a, b) => a.age - b.age);
// 结果:Bob(20) → John(25) → Alice(30)
2. 字符串按长度排序
const fruits = ["Apple", "Banana", "Cherry", "Kiwi"];
fruits.sort((a, b) => a.length - b.length);
// 输出 ["Kiwi", "Apple", "Banana", "Cherry"] ✅
四、关键注意事项
-
原地排序:
sort()
会直接修改原数组,而非返回新数组。- 若需保留原数组,需先拷贝
const original = [3, 1, 4, 2];
const sorted = [...original].sort((a, b) => a - b);
[...original]
:创建原数组的浅拷贝
- 展开运算符(Spread Operator)
...
会展开原数组original
的所有元素。 - 创建一个新数组,其元素与原数组完全相同。
-
稳定性:
- ES2019 后,
sort()
是稳定的(相同值的元素顺序保持不变)。
- ES2019 后,
-
非数字类型的排序:
- 对非数字类型(如对象、字符串)排序时,需自定义比较逻辑。