Javascript 中 Array的 sort()方法其实是把要排序的内容转化为string(调用 toString()), 然后按照字符串的第一位 ascii 码先后顺序进行比较,不是数字。
我们看看官方是怎么说的:
arrayobj.sort(sortfunction)
参数
arrayObj
必选项。任意 Array 对象。
sortFunction
可选项。是用来确定元素顺序的函数的名称。如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列。
说明
sort 方法将 Array 对象进行适当的排序;在执行过程中并不会创建新的 Array 对象。
如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一:
- 负值,如果所传递的第一个参数比第二个参数小。
- 零,如果两个参数相等。
- 正值,如果第一个参数比第二个参数大。
<html> <head> <script type="text/javascript"> var arr = [1,3, 25];
arr.sort(); alert(arr); </script> </head> <body> </body> </html>
结果: 1,25,3
那么怎么办呢?我们可以写一个 compare() 方法
<html> <head> <script type="text/javascript"> var arr = [ 1, 3, 25 ]; arr.sort(compare); //函数名是对象的引用,所以只写名字就行。 alert(arr); function compare(num1, num2) { var temp1 = parseInt(num1); var temp2 = parseInt(num2); if (temp1 < temp2) { return -1; } else if (temp1 == temp2) { return 0; } else { return 1; } } </script> </head> <body> </body> </html>
结果: 1,3,25
我们可以把上面代码改写成匿名类的方式:
<html> <head> <script type="text/javascript"> var arr = [ 1, 3, 25 ]; arr.sort(function (num1, num2) { var temp1 = parseInt(num1); var temp2 = parseInt(num2); if (temp1 < temp2) { return -1; } else if (temp1 == temp2) { return 0; } else { return 1; } } ) alert(arr); </script> </head> <body> </body> </html>
结果一样: 1,3, 25