javascript数组sort()默认按字符串unicode码点排序,数值排序需传比较函数;reverse()仅反转原数组顺序,两者均直接修改原数组。

JavaScript 数组的 sort() 方法默认把每个元素转成字符串,再按 Unicode 码点顺序比较,所以数字数组直接调用 sort() 会得到字典序结果,而不是数值大小顺序。这不是 bug,而是语言规范明确规定的默认行为。
为什么默认按字符串排序
ECMAScript 规范要求 sort() 在没有传入比较函数时,使用抽象关系比较(Abstract Relational Comparison),该过程会强制将操作数转为字符串再逐字符比对。比如 [10, 2, 33] 转成 ["10", "2", "33"] 后,"10" 开头是 "1","2" 开头是 "2",而 "1" [10, 2, 33],明显不符合数值逻辑。
这种设计初衷是让字符串排序开箱即用,对纯字母、中文、符号等场景天然友好;但代价是对数字、对象等类型必须显式干预。
数字数组升序与降序排序
只需传入一个二元比较函数,返回 a - b(升序)或 b - a(降序)即可:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
升序:
[10, 2, 33].sort((a, b) => a - b)→[2, 10, 33] -
降序:
[10, 2, 33].sort((a, b) => b - a)→[33, 10, 2]
原理:当 a - b ,<code>a 排前面;等于 0 不变;大于 0 则 a 排后面。这个逻辑恰好对应升序排列。
处理字符串形式的数字(如 ["10", "2", "33"])
如果数组元素是字符串数字,需先转为数值再比较:
- 安全写法:
arr.sort((a, b) => Number(a) - Number(b)) - 更健壮(跳过非法值):
arr.sort((a, b) => (Number(a) || 0) - (Number(b) || 0)) - 整数优先可用
parseInt(a, 10),但注意"10px"会被截断为10,有隐式风险
避免原数组被修改
sort() 是原地操作,会改变原始数组。如需保留原数组,排序前先拷贝:
- 浅拷贝(推荐多数情况):
[...arr].sort((a, b) => a - b) - 兼容老环境:
arr.slice().sort((a, b) => a - b)
注意:拷贝只解决“不改原数组”问题,不影响排序逻辑本身。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










