JavaScript的sort()默认按字符串Unicode码点排序,而非数值大小:如[10,2,1,4].sort()得[1,10,2,4],因转为字符串后字典序比较;修复需传比较函数如(a,b)=>a-b,对象排序须提取属性参与比较,且sort()会修改原数组。

JavaScript 的 sort() 方法默认不按数值大小排序,而是把所有元素转成字符串,再按 Unicode 码点顺序排——这是绝大多数排序出错的根源。
数字排序为什么总错
直接调用 [10, 2, 1, 4].sort() 得到的是 [1, 10, 2, 4],不是因为 bug,而是它先把每个数变成字符串:"10"、"2"、"1"、"4",然后按字典序比较:"1"
- 升序必须写
(a, b) => a - b - 降序写
(a, b) => b - a - 遇到
null或undefined会转成字符串参与比较,可能混入中间;NaN会导致比较结果为NaN,破坏排序稳定性
对象数组按属性排序
对对象数组,不能直接 sort(),得提取属性值参与比较:
- 按数字属性(如
price)升序:arr.sort((a, b) => a.price - b.price) - 按字符串属性(如
name)排序,推荐用localeCompare:arr.sort((a, b) => a.name.localeCompare(b.name)),它能正确处理大小写、重音和多语言 - 避免写
a.name > b.name ? 1 : -1,这种写法不返回 0,会破坏稳定排序,且大小写敏感
多条件排序怎么写
当主条件相同时需要次级规则,比如“先按部门升序,部门相同时按年龄降序”:
立即学习“Java免费学习笔记(深入)”;
- 用链式判断:先比第一条件,不等就返回;相等再比第二条件
- 示例:
users.sort((a, b) => { if (a.dept !== b.dept) return a.dept.localeCompare(b.dept); return b.age - a.age; }) - 注意:每个比较分支都要有明确返回值,否则部分浏览器可能行为不一致
别忘了原数组被修改
sort() 是就地排序,会改变原始数组引用,不是返回新数组:
- React/Vue 等框架中直接
arr.sort()可能触发意外重渲染或状态不一致 - 想保留原数组,先复制:
[...arr].sort(...)或arr.slice().sort(...) - 如果用的是不可变数据模式(如 Redux),必须显式创建新数组


















