排序错误的数组。Javascript

排序错误的数组。Javascript,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有以下javascript数组: a=[0, "b", 2, 3, 4, 5, 1, 9, 8, "A", "a", 11010] 现在我想对它进行排序,我这样做 a.sort() 但我得到了以下信息: [0, 1, 11010, 2, 3, 4, 5, 8, 9, "A", "a", "b"] a.sort(function(a,b){return a-b;}); [0, "b", 11010, 2, 3, 4, 1, 8, 9, "A", "a", 5] 我认为这是错误的,因为1

我有以下javascript数组:

a=[0, "b", 2, 3, 4, 5, 1, 9, 8, "A", "a", 11010]
现在我想对它进行排序,我这样做

a.sort()
但我得到了以下信息:

[0, 1, 11010, 2, 3, 4, 5, 8, 9, "A", "a", "b"]
a.sort(function(a,b){return a-b;});
[0, "b", 11010, 2, 3, 4, 1, 8, 9, "A", "a", 5]
我认为这是错误的,因为11010大于2,应该在2之后。 即使我做了以下事情:

[0, 1, 11010, 2, 3, 4, 5, 8, 9, "A", "a", "b"]
a.sort(function(a,b){return a-b;});
[0, "b", 11010, 2, 3, 4, 1, 8, 9, "A", "a", 5]
我得到以下信息:

[0, 1, 11010, 2, 3, 4, 5, 8, 9, "A", "a", "b"]
a.sort(function(a,b){return a-b;});
[0, "b", 11010, 2, 3, 4, 1, 8, 9, "A", "a", 5]

有人能解释一下为什么会发生这种情况吗?谢谢

问题是,在排序时,JavaScript默认将所有数组元素视为字符串

JavaScript不像Haskell或Java那样是类型安全的。这意味着您可以执行各种疯狂的操作,比如添加数字和字符串,或者在不抛出错误的情况下将字符串与数字进行比较

如表中所示,1的值为49,小于小写a的值97

“1”放在“10110”之前,原因与“a”排序在“apple”之前相同



涵盖了许多由不同类型操作导致的高度意外的JavaScript默认模式

您的数组既有数字也有字符串。您需要做的是提供一个比较函数

a = [0, "b", 2, 3, 4, 5, 1, 9, 8, "A", "a", 11010]
a.sort(function(c1, c2) {
    if(typeof c1 === "number" && typeof c2 == "number") {
        return c1 - c2;
    } else {    
        return (c1 + "").localeCompare(c2);
    }
 );

看看array.sort在这种情况下是如何工作的

如果您不提供自己的排序功能,那么

“元素通过将其转换为字符串并进行比较来排序 Unicode代码点顺序的字符串。“

作为一个字符串,11010位于2之前。您没有提供排序函数,因此排序方法使用默认行为


这就是为什么您会看到您注意到的行为。

排序操作中的目标顺序可能重复,以及为什么字符串和数字都在数组中?A解释了为什么“因为您包含字符串元素”,即使没有字符串值,所有元素都会被视为字符串。是的,这是他的第一个答案。