先给出《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;
}));
得到打印结果:
知道为什么了吗,官方说的第一个参数不代表在数组里面靠前的参数,第二个参数不代表在数组里面靠后的参数,而且事实也没有想象的那么简单,做了一些实验,最终没搞懂……。