为什么" .sort()"在JavaScript中将令人难以置信的小数字分类为难以置信的大数字?

时间:2014-06-21 19:05:58

标签: javascript sorting numbers

如果我要跑“[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函数将它视为一个非常大的数字。为什么是这样?是否有某些方法可以改变它,或者我只需要编写自己的函数?

3 个答案:

答案 0 :(得分:6)

来自MDN Array.sort

"默认排序顺序是根据 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字符串比较器。