JavaScript中Array.prototype.sort()的坑

先给出《JavaScript高级程序设计(第3版)》和MDN里面官方的sort()里面的比较函数:
(这是直接复制的MDN上面代码,书里面跟这个差不多,就参数名不一样)

function compare(a, b) {
  if (a < b ) {           // 按某种排序标准进行比较, a 小于 b
    return -1;
  }
  if (a > b ) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

《JavaScript高级程序设计(第3版)》和MDN里面是这么说的,如果比较函数的返回值为负数,那么第一个参数应该放在第二个参数前面,反之。

原话就是这么个意思。

那意思就是,当比较函数的返回值恒为负数时,第一个参数就始终在第二个参数前面,那么数组的顺序应该不会变,反之。但事实真的是这样吗?

执行如下代码:

 const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
 console.log(arr.sort((item1, item2) => {
   return -1;
 }));

得到结果:
在这里插入图片描述
居然是这种结果,太神奇了,比较函数返回负数居然把数组reverse()了!!!不是说好返回负数第一个参数在第二个参数前面吗??? 这是在chrome上面运行的,以为是浏览器内核的问题,故又去IE上运行了一下,得到一样的结果。难道是返回负数正着排,正数倒着排?但是这种想法一旦拿到本文最开始给出的排序函数中去实现一下就会发现,MD,排序又会反着来了。那这是怎么回事呢。

最后,不得不打印出了那神奇的第一个参数和第二个参数,看看他们到底是何方神圣。

执行如下代码:

  const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  console.log(arr.sort((item1, item2) => {
    console.log(item1, item2);
    return -1;
  }));

得到打印结果:
在这里插入图片描述
知道为什么了吗,官方说的第一个参数不代表在数组里面靠前的参数,第二个参数不代表在数组里面靠后的参数,而且事实也没有想象的那么简单,做了一些实验,最终没搞懂……。

总结:不要纠结太多,会用就行,记得return a - b是升序,return b - a是降序就好了,如果是数组对象,那就return obj1.value - obj2.value来升序排, return obj2.value - obj1.value来降序排。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值