今天又被一个小坑绊了一下,说出来给各位提个醒。手头有个榜单要按数值排,数组大概长 [1, 2, 10, 3] 这样,我顺手 .sort() 一调,结果给我吐回来 [1, 10, 2, 3]。第一眼还以为自己眼花了。
其实 JavaScript 的 sort 默认不按数值比,而是先把元素 toString 转成字符串,再按 UTF-16 码元顺序逐个字符比。‘10’ 首位是 ‘1’,自然就排到 ‘2’ 前面去了。最阴的地方在于它属于 silent failure,不报错也不警告,页面该显示显示,数字却是错的。排行榜、价格、时长这类列表一旦直接排序,静默错乱能藏很久,排查时特别折磨。
解法说白了很简单也最易被忘:永远显式传比较函数 arr.sort((a,b)=>a-b);嫌麻烦就用 Lodash 这类类型安全的工具,从源头别给自己留"忘了加比较器"的机会。这种 classic 的低级坑,踩一回就够记住了。