JavaScript数组sort()默认按字符串Unicode码点排序,数字数组需传入比较函数;对象数组排序要处理undefined;V8引擎使用TimSort,性能优于手写排序。

JavaScript 数组原生的 sort() 方法默认按字符串 Unicode 码点排序,直接对数字数组调用会得到错误结果(比如 [10, 2, 33] 排成 [10, 2, 33]),必须传入比较函数才能正确排序。
为什么 sort() 默认不按数值排序
因为 sort() 内部会先把每个元素转成字符串再比较。数字 10 转成 "10",2 转成 "2",而 "10" 为 true(字符串比较只看首字符),所以 10 会排在 2 前面。
常见错误现象:
-
[10, 2, 33].sort()→[10, 2, 33](不是[2, 10, 33]) -
[1, 10, -5, 0].sort()→[-5, 0, 1, 10](碰巧对了,但只是巧合,不可依赖)
升序/降序:写对比较函数的关键逻辑
比较函数接收两个参数 a 和 b,返回值决定顺序:
立即学习“Java免费学习笔记(深入)”;
- 返回
:a排在b前面 - 返回
0:位置不变(稳定排序中保持原有相对顺序) - 返回
> 0:a排在b后面
升序最简写法:(a, b) => a - b;降序:(a, b) => b - a。
注意:不能直接写 a 或 return a ——这会把 0 当作 false 错误处理,且忽略相等情况。
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
处理对象数组:按字段排序要小心 undefined
对 [{name: "Alice", age: 30}, {name: "Bob"}] 按 age 排序时,Bob.age 是 undefined,参与减法会得 NaN,导致整个排序结果不可预测(甚至返回原数组乱序)。
安全写法示例(升序,undefined 排最后):
arr.sort((a, b) => {
const aVal = a.age ?? Infinity;
const bVal = b.age ?? Infinity;
return aVal - bVal;
});
更通用的策略是先做存在性判断或统一兜底值,而不是依赖隐式转换。
性能与稳定性:原生 sort() 已足够,别手写快排
V8 引擎(Chrome / Node.js)的 Array.prototype.sort() 在数组长度 ≥ 10 时使用 TimSort(稳定、高效、适应性强),小数组用插入排序。它比绝大多数手写快排/归并更可靠,也支持稳定排序(ES2019+ 规范保证)。
除非有特殊需求(如自定义比较开销极大、需中断排序、或处理超大数据流),否则不要自己实现排序算法。手写容易出错,还失去引擎优化红利。
真正容易被忽略的是:比较函数里避免副作用(如修改原数组、发起请求)、避免计算密集操作(如反复解析 JSON),这些会让排序变慢甚至行为异常。










