JavaScript中的array.sort的一些注意事项

JavaScript 中,array.sort([compareFunction]) 在不指定比较函数的情况下,将会使用默认的比较函数,而这个比较函数是根据字母表数序来比较的。简单来说,先把数组中的各项转化为 string,然后再进行比较。

这意味着对于数字的排序,必须写比较函数而不能用默认的,否则,将会导致类似 [1, 10, 11, 2, 3] 这样的排序结果。

自然地,true, false, null 等也被先转为对应的字符串再进行比较,但 undefined 有点特殊,JavaScrip 1.2 后会把其放到数组的最后面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function logSort(arr) {
    console.log('before:', arr.slice(0));
    // chrome、opera 中 console.log 是对象引用,因而会显示最后的状态,需用 copy
    arr.sort();
    console.log('after: ', arr, '\n');
}    


// 字符串
var a = ['0', '1', '8', '9', '20', '10'];
logSort(a);

// 数字
a = [0, 1, 8, 9, 20, 10];
logSort(a);

// undefined
a = [];
a[0] = 'a';
a[5] = 'z';
logSort(a);

// null
a = [];
a[0] = 'a';
a[3] = null;
a[5] = 'z';
logSort(a);

// number, string, object, array
a = [8, 10, 'a', [3, 7], {'a': 1}, 'Z'];
logSort(a);
    // arr.toString => 'item1,item2...', obj.toString => '[object Object]'
    // '[' 在 ASCII 中为 91, A 为 65, a 为 97, Z 为 90

a = [true, false, null, undefined, 0, 1, 9, 10, 20];
logSort(a);

对于以上代码,Chrome 的开发者工具中有以下输出