javascript的sort函数的参数

在学习js函数这块时遇到了一个讲函数作为返回值的例子,这个例子最后是将这个返回值作为参数传给sort()函数来执行的,其实之前也遇见过sort()函数用函数做形参,只是当时没有在意,今天又遇到了,所以想把它弄明白......

sort()函数在w3school的教程入门上已经明确的说明了它可以有一个形参,并且如果有参数那么这个参数一定是一个函数,而且还给了相应的例子:

定义和用法
sort() 方法用于对数组的元素进行排序。

语法
arrayObject.sort(sortby)
参数	描述
sortby	可选。规定排序顺序。必须是函数。

排序不正确的例子:

<script type="text/javascript">

var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"

document.write(arr + "<br />")
document.write(arr.sort())

</script>
输出:

10,5,40,25,1000,1
1,10,1000,25,40,5

排序正确的例子:

<script type="text/javascript">

function sortNumber(a,b)
{
return a - b
}

var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"

document.write(arr + "<br />")
document.write(arr.sort(sortNumber))

</script>
输出:

10,5,40,25,1000,1
1,5,10,25,40,1000

当看到这时我之前的疑惑就是,哪里的数值来给sortNumber函数传参?而sortNumber函数的返回值是如何影响sort函数的?

其实知乎上的大佬已经用通俗易懂的代码解释过了:

知乎关于sort()函数的回答

想真正的看懂这个函数形参还是应该看看V8关于数组排序这块的源代码(也是js的代码):

     function InsertionSort(a, from, to) {
          for (var i = from + 1; i < to; i++) {
          var element = a[i];
          for (var j = i - 1; j >= from; j--) {
            var tmp = a[j];
            var order = comparefn(tmp, element);
            if (order > 0) {
              a[j + 1] = tmp;
            } else {
              break;
            }
          }
          a[j + 1] = element;
        }
      };

这段js代码是V8上的插入排序的代码(在V8中数组长度小于10的排序使用该方法),其中那个comparefn函数就是你传进来的sort函数的形参(函数),由这段代码可以看出sort函数的形参函数的形参(也就是上文的sortNumber函数的参数)是在函数实现中把数组中的两个数穿进去;而返回值(上文的sortNumber函数的返回值)的作用就是为了告诉sort函数你想怎样对这两个数排序,然后sort函数根据这个返回信息来进行操作数组。

 

猜你喜欢

转载自blog.csdn.net/khjbilhlfg/article/details/80030641