Javascript Array.sort()不';不能正确地对数字排序

Javascript Array.sort()不';不能正确地对数字排序,javascript,Javascript,在Chrome 14和Firefox 5(尚未测试其他浏览器)中,以下代码无法正确排序数字: <script> a = new Array(); a.push(10); a.push(60); a.push(20); a.push(30); a.push(100); document.write(a.sort()) </script> a=新数组(); a、 推(10); a、 推(60); a、 推(20); a、 推(30); a、 推(100); docum

在Chrome 14和Firefox 5(尚未测试其他浏览器)中,以下代码无法正确排序数字:

<script>
a = new Array();
a.push(10);
a.push(60);
a.push(20);
a.push(30);
a.push(100);


document.write(a.sort())
</script>

a=新数组();
a、 推(10);
a、 推(60);
a、 推(20);
a、 推(30);
a、 推(100);
document.write(a.sort())
它返回10100,20,30,60

我尝试过不同的数字,它总是表现得好像0不在那里,否则会对数字进行正确排序。有人知道为什么吗

a.sort(function(a,b){return a - b})

这些可能令人困惑。。。。签出。

Javascript中数组的默认排序为。如果需要数字排序,请尝试以下操作:

var a = [ 1, 100, 50, 2, 5];
a.sort(function(a,b) { return a - b; });

您可以使用排序功能:

var myarray=[25, 8, 7, 41]
myarray.sort( function(a,b) { return a - b; } );
// 7 8 25 41

我尝试过不同的数字,它总是表现得好像0不在那里,否则会对数字进行正确排序。有人知道为什么吗

a.sort(function(a,b){return a - b})
您将获得字典排序(例如,将对象转换为字符串,并按字典顺序排序),这是Javascript中的默认排序行为:

参数

比较函数

指定定义排序顺序的函数。如果省略,数组将根据每个元素的字符串转换按字典顺序进行排序

在ECMAscript规范(通用Javascript的规范性参考)第15.4.4.11节中,默认排序顺序是字典式的,尽管他们没有说出,而是给出了概念排序函数的步骤,该函数在必要时调用给定的比较函数,否则,在转换为字符串时比较参数:

13. If the argument comparefn is undefined, go to step 16.
14. Call comparefn with arguments x and y.
15. Return Result(14).
16. Call ToString(x).
17. Call ToString(y).
18. If Result(16) < Result(17), return −1.
19. If Result(16) > Result(17), return 1.
20. Return +0.
13。如果参数comparefn未定义,请转至步骤16。
14使用参数x和y调用comparefn。
15返回结果(14)。
16调用ToString(x)。
17调用ToString(y)。
18如果结果(16)<结果(17),则返回−1.
19如果结果(16)>结果(17),则返回1。
20返回+0。
试试这个:

a = new Array();
a.push(10);
a.push(60);
a.push(20);
a.push(30);
a.push(100);
a.sort(Test)

document.write(a);


function Test(a,b)
{
    return a > b ? true : false;
}

检查这里的代码:首先,
a>b?false:true
可以简化为
a
。其次,您实际上需要返回
-1
0
1
,因此这并不完全正确(尽管它可能工作正常)。排序函数应该返回-1、0或1(不是真/假)。大多数实现实际上都会接受0,这就是为什么
返回a-b
通常适用于数字。
code
返回a-b
code
无法正确管理负数。。。aa-b;这将以相反的顺序返回。正如@pimvdb所建议的,请将答案更正为a-b。只是一个迟来的注释,如果您没有隐式传递函数,那么您是在告诉它对Unicode/字符串数组进行排序。在unicode中,100小于20。在ES6中,它甚至更优雅:
a.sort((a,b)=>a-b)
quiet-deletate。我使用了相同的ES6版本,工作起来很有魅力,为什么这不是答案???@Rohith这个答案是在我刚刚加入SO时写的,老实说,这也不是一个很好的答案P这个解决方案很好,但是它不能解释为什么会出现这个问题,所以我认为Jason的答案应该是有标记的解决方案。不过,我很高兴你发现我的答案很有用@maxhud,如果你想发布一些东西,添加你自己的答案。这是采访中问我的。哈哈,我知道js很奇怪!但是我喜欢它,哈哈