我有以下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"]
我认为这是错误的,因为11010大于2且应该在2之后。 即使我做了以下事情:
a.sort(function(a,b){return a-b;});
我得到以下内容:
[0, "b", 11010, 2, 3, 4, 1, 8, 9, "A", "a", 5]
有人可以解释一下为什么会这样吗?谢谢
答案 0 :(得分:3)
问题是,在排序时,JavaScript默认将所有数组元素视为字符串。
JavaScript不像Haskell或Java那样是类型安全的。这意味着您可以执行各种疯狂操作,例如添加数字和字符串,或者将字符串与数字进行比较而不会产生错误。
正如您在此表中所见, 1 的值为49,小于 a
的值97“1”放在“10110”之前,原因与“a”在“apple”之前排序相同
This video涵盖了由不同类型操作导致的许多非常意外的JavaScript默认模式。
答案 1 :(得分:2)
看一下array.sort如何在link处工作。
如果您不提供自己的排序功能,那么
“元素通过将它们转换为字符串并进行比较来排序 Unicode代码点顺序中的字符串。“
作为字符串,11010在2.之前。您没有提供排序功能,因此排序方法使用默认行为。
这就是为什么你会看到你注意到的行为。
答案 2 :(得分:1)
您的数组包含数字和字符串。您需要做的是提供比较功能。
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);
}
);