You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么JavaScript的Array.sort()比较函数会出现下述特殊运行表现?

问题解答

核心误解点

你对返回值规则的理解存在偏差:只有返回值为0时,才会保持a和b的原有相对顺序,返回值小于0/大于0都是主动要求调整两者的顺序,和两者原来的位置无关:

  • 返回值 < 0:强制要求将a放到b的前面,不管两者原来的顺序是什么
  • 返回值 > 0:强制要求将b放到a的前面,不管两者原来的顺序是什么
  • 返回值 = 0:不调整两者的相对顺序

你的代码运行逻辑解释

  1. arr1.sort((a, b) => 1)
    所有比较操作固定返回>0,也就是不管参与比较的两个元素是什么值,都要求把后取到的元素b放到先取到的元素a前面,排序算法会按照这个规则对全数组重排,最终得到原数组的完全倒序结果:[1,7,6,3,9]

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:54:02