以下是一个例子:
var arr = [1,13,39,33]; arr.sort(function(a,b) { return a - b });
我理解算法是如何工作的,但JS编译器如何知道 A 和 B 参数是什么?
答案 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
适用于支持<
运算符的任何类型。