JavaScript 中 sort 函数 为什么 return a-b 就是升序?

在提出这个问题的时候也查阅了一些资料,了解到 v8 里的 sort 在不同的数组长度下采用不同的排序方式。

这里暂且我们就只考虑很基础的排序方式,也就是数组长度小于10的时候。

const arr=  [1,2,3,4];
arr.sort((a,b)=>
{return a-b}
)

我了解到此时的情况 sort 会采用插值排序,但是了解过插值排序的逻辑以后,并没有发现和 sort 回调函数 的返回值 a-b 有什么关系。

百思不得其解,特来请教。

阅读 3.4k
4 个回答

你可以试着手写一个 sort(),大致就明白了:

function sort<T>(arr: T[], compareFn?: (a: T, b: T) => number): T[] {
  if (!compareFn) {
    compareFn = (a, b) => (a + '').charCodeAt(0) - (b + '').charCodeAt(0);
  }

  const n = arr.length;
  for (let i = 1; i < n; i++) {
    for (let j = i; j > 0; j--) {
      if (compareFn(arr[j], arr[j - 1]) < 1) {
        [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
      } else {
        break;
      }
    }
  }
  return arr;
}
// test
console.log(sort([3, 62, 10, 43]));
console.log(sort([3, 62, 10, 43], (a, b) => a - b));
console.log(sort([3, 62, 10, 43], (a, b) => b - a));

// [ 10, 3, 43, 62 ]
// [ 3, 10, 43, 62 ]
// [ 62, 43, 10, 3 ]

有没有可能,是根据你返回 「正数、0、负数」 来判断是「大于、小于、还是等于」呢?

可以参考下这篇文章,sort排序

这是ecma规范中关于sort的排序执行过程,sort说明
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题