JavaScript中的排序方法之 sort()有坑

667 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

数组的排序

数组的排序有很多, 今天跟着 老道JavaScript, 学到了其中之一 sort方法. 然而这个方法里面有很多坑, 不知道你有没有注意到

sort

排序方法会改变原数组!

sort 方法排序我们都再熟悉不过了吧, 但是这里面的原理, 有些问题可能都不太了解

sort方法无法对冻结数组进行排序, 同时对共享数组进行排序操作也有问题

  • 冻结数组: Object.freeze(my_array), 冻结的为对象本身.

  • 冻结后, 不能修改, 不能添加, 不能删除

  • 这时如果对冻结数组进行排序会出现问题了

  let my_array = ['xn213', 'rainbows', 'beauty', 'moments']
  Object.freeze(my_array)
  my_array.sort()

上面代码在 Chrome console 面板的运行结果如下:

1-js-sort

  let my_array = ['xn213', 'rainbows', 'beauty', 'moments']
  my_array.sort()
  // my_array ---> ['beauty', 'moments', 'rainbows', 'xn213']

上面代码中 sort 改变了原数组, 我们发现是以字符串首字母进行排序的, 那么我们再看下面的代码:

  let my_array = [213, 21, 2, 13, 10, 3, 9, 5, 29, 19]
  my_array.sort()
  // [10, 13, 19, 2, 21, 213, 29, 3, 5, 9]

这里 2 却排在了 19的后面, 并没有达到我们想要的按大小排序的效果. 因为 sort 方法的默认比较函数会将所有比较对象先转成字符串, 这个特性不仅拖慢了性能, 感觉就是一个bug.

上面没有传递参数, 好在我们可以传入一个我们自定义的比较函数.

❤❤❤ 这个函数接收两个参数: 在比较大小的时候, 如果认为第一个参数应当排在前面, 则自定义比较函数需要返回一个 负数; 同理, 如果第二个参数应当排在前面, 则需返回正数. 如果自定义比较函数返回 0, 则表示比较函数无法判断两者大小.

  function compare(first, second) {
    return first - second
  }

如果数组中存在 非有穷数值(Infinity 或者 NaN), 上面的函数则不好使了, 需要进行改进, 发挥你的聪明才智吧.评论区见分晓:...