数组sort()方法中比较函数的工作原理及参数传递疑问
JavaScript中sort()比较函数的参数顺序疑问解答
首先明确:sort()方法的比较函数里,参数a和b的传入顺序不是严格按照数组的原始先后顺序,而是由底层排序算法的比较逻辑决定的——它本质是在判断「是否需要交换两个元素的位置」时,把待评估的两个元素传入函数。
拿你的代码举例:
let num = [3, 9, 1, 6] function sortNum(a,b){ console.log(a); // 输出9 console.log(b); // 输出3 return a-b; } num.sort(sortNum); console.log(num); // [1, 3, 6, 9]
当排序算法第一次对比3和9时,它是把后一个元素9作为a,前一个元素3作为b传入的。这时候return a-b得到6(大于0),按照sort()的规则:
- 返回值>0:交换
a和b的位置 - 返回值=0:位置不变
- 返回值<0:不交换位置
这里返回6>0,sort()会把a(9)放到b(3)的后面,最终还是保持3在前、9在后,和升序需求一致。
换句话说,不管a和b谁先谁后,只要你写return a-b,sort()最终都会帮你把数组按升序排列:
- 如果
a比b大,返回正数,触发交换把大的元素往后放 - 如果
a比b小,返回负数,不交换,让小的元素留在前面
你看到的a=9、b=3只是排序过程中的一次比较,整个排序还会进行多轮对比(比如后续会拿1和3、6和9等对比),最终得到正确的排序结果。
内容的提问来源于stack exchange,提问作者jlugada
相关产品推荐
相关产品推荐

