TypeScript(继承自 JavaScript)数组 sort() 方法的默认排序规则是:将所有元素转换为字符串,然后按 UTF-16 码元值(Unicode Code Point)升序排列。
这意味着:
- 非数值排序 :数字会被先转为字符串再比较。例如
[10, 2].sort()结果是[10, 2],因为字符串"10"的首字符"1"小于"2"。 - 区分大小写 :大写字母的 Unicode 值小于小写字母,因此
"Z"会排在"a"前面。 - 原地修改:该方法会直接改变原数组,并返回该数组的引用。
若需按数值大小或其他逻辑排序,必须传入比较函数 ,例如数字升序使用 (a, b) => a - b。
TypeScript 的 sort() 本质上和 JavaScript 一样,用于原地排序数组。
1. 数字排序
升序
const nums = [5, 2, 8, 1, 9];
nums.sort((a, b) => a - b);
console.log(nums);
// [1, 2, 5, 8, 9]
降序
const nums = [5, 2, 8, 1, 9];
nums.sort((a, b) => b - a);
console.log(nums);
// [9, 8, 5, 2, 1]
2. 字符串排序
字母升序
const names = ["Tom", "Alice", "Bob"];
names.sort();
console.log(names);
// ["Alice", "Bob", "Tom"]
忽略大小写
const names = ["tom", "Alice", "bob"];
names.sort((a, b) =>
a.toLowerCase().localeCompare(b.toLowerCase())
);
console.log(names);
// ["Alice", "bob", "tom"]
3. 对象数组排序
假设:
interface User {
name: string;
age: number;
}
const users: User[] = [
{ name: "Tom", age: 25 },
{ name: "Alice", age: 18 },
{ name: "Bob", age: 30 },
];
按年龄升序
users.sort((a, b) => a.age - b.age);
结果:
[
{ name: "Alice", age: 18 },
{ name: "Tom", age: 25 },
{ name: "Bob", age: 30 },
]
按年龄降序
users.sort((a, b) => b.age - a.age);
按名字排序
users.sort((a, b) =>
a.name.localeCompare(b.name)
);
4. 多字段排序
先按年龄,再按名字:
users.sort((a, b) => {
if (a.age !== b.age) {
return a.age - b.age;
}
return a.name.localeCompare(b.name);
});
例如:
[
{ name: "Tom", age: 20 },
{ name: "Alice", age: 20 },
{ name: "Bob", age: 18 },
]
排序后:
[
{ name: "Bob", age: 18 },
{ name: "Alice", age: 20 },
{ name: "Tom", age: 20 },
]
5. 日期排序
interface Order {
id: number;
createdAt: string;
}
const orders: Order[] = [
{ id: 1, createdAt: "2026-06-01" },
{ id: 2, createdAt: "2026-05-01" },
{ id: 3, createdAt: "2026-07-01" },
];
orders.sort(
(a, b) =>
new Date(a.createdAt).getTime() -
new Date(b.createdAt).getTime()
);
6. 不修改原数组
sort() 会修改原数组:
const arr = [3, 1, 2];
const sorted = [...arr].sort((a, b) => a - b);
console.log(arr); // [3,1,2]
console.log(sorted); // [1,2,3]
或者现代写法(Node.js 20+ / 新浏览器):
const sorted = arr.toSorted((a, b) => a - b);
面试常考点
默认排序是按字符串比较:
[1, 10, 2].sort();
结果:
[1, 10, 2]
因为实际上比较的是:
["1", "10", "2"]
数字排序一定要写:
arr.sort((a, b) => a - b);