为什么JavaScript的Array.sort()比较函数会出现下述特殊运行表现?
问题解答
核心误解点
你对返回值规则的理解存在偏差:只有返回值为0时,才会保持a和b的原有相对顺序,返回值小于0/大于0都是主动要求调整两者的顺序,和两者原来的位置无关:
- 返回值 < 0:强制要求将
a放到b的前面,不管两者原来的顺序是什么 - 返回值 > 0:强制要求将
b放到a的前面,不管两者原来的顺序是什么 - 返回值 = 0:不调整两者的相对顺序
你的代码运行逻辑解释
arr1.sort((a, b) => 1)
所有比较操作固定返回>0,也就是不管参与比较的两个元素是什么值,都要求把后取到的元素b放到先取到的元素a前面,排序算法会按照这个规则对全数组重排,最终得到原数组的完全倒序结果:[1,7,6,3,9]arr2.sort((a, b) => -1)
所有比较操作固定返回<0,也就是不管参与比较的两个元素是什么值,都要求把先取到的元素a放到后取到的元素b前面,相当于告诉排序算法现有元素的顺序已经符合要求,不需要调整,所以最终数组保持初始值不变:[9,3,6,7,1]
规则验证
你可以用标准升序写法验证规则:arr.sort((a,b) => a - b)
- 当
a > b时,a-b结果为正,要求把b放到a前面,小值在前 - 当
a < b时,a-b结果为负,要求把a放到b前面,小值在前 - 当
a = b时,返回0,不调整两者顺序
最终得到从小到大排序的数组,完全符合规则要求。
内容的提问来源于stack exchange,提问作者Heaven
相关产品推荐
相关产品推荐

