1、sort()的直接用法:
将传入的参数,每一项调用tostring()方法,然后比较得到的字符串,使之按升序排序。
2、sort()的比较函数用法:
写一段比较函数,
function compare(a, b){
return a - b;
}
然后可以使用array.sort(compare);
比较以下两组输出结果,
function compare(a, b){
return a - b;
}
var arr =new Array(1,2,6,11,34);
arr.sort();
console.log(arr);
arr.sort(compare);
console.log(arr);
可以看出,直接调用sort()因为比较字符串,对数字的排序可能会出差错,那么传入比较函数是如何实现成功排序的呢?
V8源码如下:
按照注释来说应该是,先采用快排,快排递归到每部分长度都小于10,对长度小于10的数组,采用插入排序,插入排序是稳定的排序算法。760行开始是快排源码,可以参考数据结构的快排递归思想。
参数comparefn是传入的比较函数。
先通过is_callable(),如果有comparefn这个参数,就直接调用插入排序,如果没有就定义一个comparefn函数。
那么要知道%_IsSmi()就去查
https://github.com/v8/v8/blob/3a1ab8c626dfee28a5cafb6632b28e284c4cffb3/src/codegen.cc
在第243行,
243行表明GenerateIsSmi即_IsSmi()在v8的namespace是internal中。再查
https://github.com/v8/v8/blob/3a1ab8c626dfee28a5cafb6632b28e284c4cffb3/src/codegen-ia32.cc
该链接的源码最后一行,
表明codegen-ia32就是v8::internal,
找到其中3949行,
自定义的comparefn中都是返回字符串比较后的结果。
3、sort()的其他用法:
随机排序:
arr.sort(function(){ return Math.random()>0.5 ? 1 : -1 ;});