Sort()函数:JS编译器如何知道A和B是什么?

时间:2015-09-03 20:25:05

标签: javascript sorting

以下是一个例子:

var arr = [1,13,39,33]; arr.sort(function(a,b) { return a - b });

我理解算法是如何工作的,但JS编译器如何知道 A B 参数是什么?

5 个答案:

答案 0 :(得分:1)

这是一个匿名或lambda函数。它是许多语言中的常见模式。 sort()方法期望作为一个参数,它自己接受两个参数。您可以使用两个参数编写函数,sort()函数将使用两个参数调用您的函数。

答案 1 :(得分:1)

如果您熟悉数组上的forEach方法,那就是同样的想法。在JS中,您可以使用

遍历数组
[5,3,1,3].forEach(function(val){
  console.log(val);
  // prints 5,3,1,3
});

所以类似的问题是,JS如何知道每次迭代中val是什么?以下是实现我们自己的forEach版本的原因:

Array.prototype.forEach = function(cb) {
  for (var i = 0; i < this.length; i++) {
    var item = this[i];
    cb(item);
  }
};

如您所见,forEach方法接受回调函数作为其唯一输入,然后该回调传递数组的每个值,一次一个。这与sort()的想法相同。

答案 2 :(得分:1)

这就是定义函数的方式(只是为了理解)。

Array.prototype.sort2 = function(sortFunction){
    //this == the array.
    var result temp;
    for(var i = 0; i < this.length-1; i++){
       result = sortFunction(this[i], this[i+1]);
       if(result < 0){
          temp = this[i+1]; //if larger than 0 or equal it means the order is correct
          this[i+1] = this[i];
          this[i] = temp;
       }
    }
}

答案 3 :(得分:1)

此处的匿名函数(带有A和B的函数)实际上是一个要排序的参数。排序使用该函数来确定您的数组中的一个元素是否为&#34;更小&#34;或者&#34;应该先来&#34;在对数组进行排序时。

有了像数字这样的东西,它非常简单。但是你有一些自定义对象呢?假设您有一些项目对象,其中包含负责人的姓名以及项目剩余的时间。现在,您需要先根据此人的姓名排序,然后按时间排序。 &#34;第一岬&#34;不再那么直截了当了。因此,如果您的数组中有任何两项内容,您可以创建一个函数来确定哪个订单首先出现。对功能进行排序,以确定&#34; first-ness&#34;。

答案 4 :(得分:0)

在无类型语言中,我们对运行时A和B的含义一无所知。您的示例假设排序数组仅包含数值。请考虑以下代码:

var arr = ["d", "c", "b", "a"]
var comparator = function(a,b){return a-b}
var comparator2 = function(a,b){return a < b ? -1 : a == b ? 0 : 1 }

console.log(arr.sort(comparator))
console.log(arr.sort(comparator2))

第一个比较器被破坏,因为字符串的减法没有意义,但是comparator2适用于支持<运算符的任何类型。