前两天帮人看一段老代码,[3,1,30,10].sort() 跑出来是 [1,10,3,30],对方一口咬定数组被改坏了。其实 sort 不传比较函数时,会把元素先 toString() 再按字典序逐位比。‘10’ 首字符 ‘1’ 排在 ‘3’ 前,所以 10 在 3 前面;‘30’ 首字符也是 ‘3’,比到第二位时 ‘3’ 没有字符了,于是 ‘3’ 反而落在 ‘30’ 后面。于是 30 被挤到 10 后头,看着就像 30 输给了 10。
这坑最阴的地方是不报错不警告,本地几条数据测着挺正常,上了量才露馅。修起来就一行:arr.sort((a,b)=>a-b)。攒了点经验…,凡用 sort 排数字,比较函数老老实实写上比裸调用稳。C’est la vie,跟排序讲礼貌是要吃亏的