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. 数字排序
升序
bash
const nums = [5, 2, 8, 1, 9];
nums.sort((a, b) => a - b);
console.log(nums);
// [1, 2, 5, 8, 9]
降序
bash
const nums = [5, 2, 8, 1, 9];
nums.sort((a, b) => b - a);
console.log(nums);
// [9, 8, 5, 2, 1]
2. 字符串排序
字母升序
bash
const names = ["Tom", "Alice", "Bob"];
names.sort();
console.log(names);
// ["Alice", "Bob", "Tom"]
忽略大小写
bash
const names = ["tom", "Alice", "bob"];
names.sort((a, b) =>
a.toLowerCase().localeCompare(b.toLowerCase())
);
console.log(names);
// ["Alice", "bob", "tom"]
3. 对象数组排序
假设:
bash
interface User {
name: string;
age: number;
}
const users: User[] = [
{ name: "Tom", age: 25 },
{ name: "Alice", age: 18 },
{ name: "Bob", age: 30 },
];
按年龄升序
bash
users.sort((a, b) => a.age - b.age);
结果:
bash
[
{ name: "Alice", age: 18 },
{ name: "Tom", age: 25 },
{ name: "Bob", age: 30 },
]
按年龄降序
bash
users.sort((a, b) => b.age - a.age);
按名字排序
bash
users.sort((a, b) =>
a.name.localeCompare(b.name)
);
4. 多字段排序
先按年龄,再按名字:
bash
users.sort((a, b) => {
if (a.age !== b.age) {
return a.age - b.age;
}
return a.name.localeCompare(b.name);
});
例如:
bash
[
{ name: "Tom", age: 20 },
{ name: "Alice", age: 20 },
{ name: "Bob", age: 18 },
]
排序后:
bash
[
{ name: "Bob", age: 18 },
{ name: "Alice", age: 20 },
{ name: "Tom", age: 20 },
]
5. 日期排序
bash
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() 会修改原数组:
bash
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+ / 新浏览器):
bash
const sorted = arr.toSorted((a, b) => a - b);
面试常考点
默认排序是按字符串比较:
bash
[1, 10, 2].sort();
结果:
bash
[1, 10, 2]
因为实际上比较的是:
bash
["1", "10", "2"]
数字排序一定要写:
bash
arr.sort((a, b) => a - b);
===================
Theoweb3
CSDN 用户 ID:wwh1st,GitHub:theoweb3,TG:theo_liu,X:theoweb33,谷歌邮箱:wwh9th,公众号:穗余
深耕 Web3 领域,为公链与分布式底层基础设施建设者,长期聚焦公链底层架构、链上基础设施、跨链协议、去中心化系统研发,持续落地基础设施相关技术实践与开源项目。
作为中文 Web3 领域内容创作者与行业 KOL,持续输出底层技术解析、生态研究、行业观察内容,面向开发者与从业者普及区块链底层逻辑,搭建技术沟通桥梁,拥有持续行业影响力。
华语 Web3 开源社区参与者与共建者,积极推动开源协作、开发者交流、技术落地实践,持续赋能华语开发者生态,推动开源方案在公链基础设施场景落地,拓展华语开源社区对外技术交流边界。
长期持续输出技术博客,记录公链底层开发、分布式系统、Web3 工程实践、开源项目落地经验,沉淀可复用技术方案,致力于用技术推动去中心化基础设施持续发展。