小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
数组的排序
数组的排序有很多, 今天跟着 老道
学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
面板的运行结果如下:
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), 上面的函数则不好使了, 需要进行改进, 发挥你的聪明才智吧.评论区见分晓:...