前两天帮人看个页面,订单列表按编号排序,结果 10 号赫然插在 2 号前头:1、10、11、12、2、3…… 对方一口咬定是后端数据乱了,我盯着接口看了半天也没毛病。最后才反应过来,锅在 JS 的 Array.sort() 默认行为上。
它压根不是按数值比。嗯规范写得明明白白…,比较前先把每个元素 toString() 一把,再按 UTF-16 码元逐位比——说白了就是 dictionary order。于是 ‘10’ 跟 ‘2’ 比,先比首字符 ‘1’ 和 ‘2’,‘1’ 的码位更小,10 自然就溜到 2 前头了。这坑在金额、ID、版本号数组上特别隐蔽,因为数据本身没错,顺序却莫名错乱,你半天找不到北。
正确姿势就一行:纯数值用 arr.sort((a, b) => a - b),字符串尤其带本地化规则的上 localeCompare。别把默认行为当成"理所应当按大小排",这个 assumption 我猜不少人都栽过。你们还见过 sort 出过什么离谱场面?