为什么JavaScript原生sort()函数的首个比较器入参是数组第二个元素?
JavaScript原生sort()比较函数首参数取值说明
现象原因
- ECMAScript规范仅对
Array.sort()的最终排序结果做了规则约束,没有强制规定底层采用的排序算法,也没有指定比较函数compareFn(a, b)的参数传入顺序,不同JS引擎的实现逻辑会有区别。 - 以Chrome使用的V8引擎为例,短数组排序默认采用插入排序逻辑(高版本V8已切换为Timsort,短数组处理逻辑保持一致):排序从数组第二个元素开始遍历,每次将当前遍历到的元素作为参数
a,和前面已排序区间的元素(作为参数b)做对比,因此你的测试代码中第一次传入比较函数的a就是原数组的第二个元素2。
补充说明
你修改后的测试代码不符合sort的使用规范:比较函数需要返回数值类型结果来指定排序规则,而console.log的返回值为undefined,会导致最终排序结果不符合预期。
你使用的测试代码如下:
let numbers = [4, 2, 5, 1, 3]; numbers.sort((a, b) => console.log('a - is - '+ a)); console.log(numbers);
内容的提问来源于stack exchange,提问作者Nina
相关产品推荐
相关产品推荐

