javascript中关于sort函数的一些理解

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 ;});


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值