看到sort大家应该很熟悉不过了,还是简单说下它的用法,然后再来一步步来模拟下实现它的原理吧!

1.sort用法

首先sort是数组的一个方法,sort() 方法用于对数组的元素进行排序!然后返回排序后的数组。默认排序顺序是升序,建立在将元素转换为字符串,然后比较其UTF-16代码单元值的序列的基础上,请注意,该数组按位置排序,并且不进行任何复制!

一.默认无参数情况
var arr=[0,11,1,22,3,44,5]
console.log(arr.sort())//[0, 1, 11, 22, 3, 44, 5]

数组会按照字符的Unicode进行排序(把数组里面当成字符串处理)。

二.参数为对比函数情况

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。

上面的描述我是从w3c上复制过来,其实说的不是很明白,很多人看的是懵的,其实你可以这样理解,传入的函数给定一对特定的元素a ,b 作为其两个参数,函数返回值大于0就是升序排列,如果是小于0就是降序!等于0就顺序不变,

var asc = (a,b)=>a-b;  //升序
var des= (a,b)=>b-a; //降序
//或者
var asc = (a, b) => a - b < 0 ? -1 : 1 //升序
var des = (a, b) => a - b < 0 ? 1 : -1 //降低序

我们先来看个例子

var asc = (a, b) => a - b < 0 ? -1 : 1 //升序
var des = (a, b) => a - b < 0 ? 1 : -1 //降低序
var arr = [10, 44, 5, 78, 1, 99];
var arr1 = [10, 44, 5, 78, 1, 99];
console.log(arr.sort(asc));// [1, 5, 10, 44, 78, 99]
console.log(arr1.sort(des))// [99, 78, 44, 10, 5, 1]
二.模拟sort的实现

首先应该注意几点
1.传入的函数必须要是函数
2.如果没传参数的话,那么就是默认升序排序方式
3.当传入的函数返回值大于0就升序排列,小于0是降序排列
根据上面几点我们自己手动模拟下

Array.prototype.sortTest = function () {
let fn = arguments ? typeof arguments[0] === "function" && arguments[0]: (x, y) => x - y;
for (var i = 0; i < this.length; i++) {
    for (var j = i + 1; j < this.length; j++) {
        if (fn(this[i], this[j]) > 0) {
            p = this[i];
            this[i] = this[j];
            this[j] = p;
        };
    };
};
return this;
}
var add = (x, y) => x - y;
var des = (x, y) => y - x;
var arr = [10, 44, 5, 78, 1, 99];
var arr1 = [10, 44, 5, 78, 1, 99];
var arr2 = [10, 44, 5, 78, 1, 99];
var arr3 = [10, 44, 5, 78, 1, 99];
console.log(arr.sortTest(add));//[1, 5, 10, 44, 78, 99]
console.log(arr1.sort(add));//[1, 5, 10, 44, 78, 99]
console.log(arr2.sortTest(des));//[99, 78, 44, 10, 5, 1]
console.log(arr3.sort(des));//[99, 78, 44, 10, 5, 1]

上面是简单的模拟下sort实现的原理!其实底层实现没有这么的简单!只是用最简单的方式来实现出来的,方便大家对sort的更深刻理解!