如果我要跑“[6,3,8,7,5,2,1,9,4,0] .sort()”我得到“[0,1,2,3,4,5] ,6,7,8,9]“作为你期望的输出。它将数字从最小到最大排序。但如果我要运行“[2,3,1,4e-20] .sort()”,我会得到“[1,2,3,4e-20]”作为输出。为什么“.sort()”函数将“4e-20”视为大于“3”?即使您运行“3> 4e-20”,您也会得到“true”作为输出,表明JavaScript确实意识到“4e-20”是一个非常小的数字。但是sort函数将它视为一个非常大的数字。为什么是这样?是否有某些方法可以改变它,或者我只需要编写自己的函数?
答案 0 :(得分:6)
"默认排序顺序是根据 string Unicode代码点。"
然后继续" [比较]比较数字而不是字符串,比较函数可以简单地从a中减去b。以下函数将对数组进行升序排序":
function compareNumbers(a, b) {
return a - b;
}
答案 1 :(得分:4)
javascript中的Array.sort()不按<排序和>,它改为执行词汇排序,这意味着它将数字视为字符串并按这种方式对它们进行排序。这就是导致较长的4e-20排序高于较短和(词汇)较低3的原因。
虽然a - b
有效,但这是理论上更快的比较,因为它是无分支的:(a > b) - (a < b)
答案 2 :(得分:3)
您可能想要这样做:
[2, 3, 1, 4e-20].sort(function (a, b) {
return a - b;
});
这是因为(根据MDN)当没有提供分类器功能时,它使用unicode字符串比较器。