JavaScript数组sort()默认按字符串Unicode排序,数字排序需传入比较函数如(a,b)=>a-b;对象按字段排序用a.field-b.field或localeCompare;推荐扩展运算符生成新数组以避免副作用。
JavaScript 中数组排序主要靠 sort() 方法,但它默认按字符串 Unicode 码点排序,直接用于数字会出错;优化排序关键在于正确传入比较函数,并结合业务场景选择稳定、高效的方式。
sort() 默认把元素转成字符串再比对,所以 [10, 2, 33, 1] 会排成 [1, 10, 2, 33](因为 "1"
arr.sort((a, b) => a - b)
arr.sort((a, b) => b - a)
比如按用户年龄排序:users = [{name:'Alice', age:32}, {name:'Bob', age:25}],可这样写:
users.sort((a, b) => a.age - b.age)
users.sort((a, b) => a.name.localeCompare(b.name))
users.sort((a, b) => a.age - b.age || a.name.localeCompare(b.name))
ES2019 起,Array.prototype.sort() 在多数引擎中已是稳定排序(相同值的相对位置不变),但仍有例外。若需强保障
或处理大数据量:
slice().sort() 避免污染原数组直接调用 arr.sort() 会修改原数组。习惯上更推荐生成新数组:
const sorted = [...arr].sort((a, b) => a - b)arr.filter(...).map(...).sort(...) 更易读且不可变any 导致隐式转换错误不复杂但容易忽略。写对比较函数,选对调用方式,排序就稳了。