这个函数如何与javaScript中的排序方法交互?

这个函数如何与javaScript中的排序方法交互?,javascript,Javascript,在我正在阅读的一本javaScript书籍中,它提供了一个方便的函数,可以帮助排序方法以正确的顺序输出值(对于数字) var值=[0,1,5,10,15]; value.sort(); console.log(值)//输出0,1,10,15,5 功能比较(值1、值2){ 如果(值1值2){ 返回1; }否则{ 返回0; } var值=[0,1,5,10,15]; 排序(比较); console.log(值);//输出0,1,5,10,15 我知道最终会发生什么,但对于“compare”函数是如

在我正在阅读的一本javaScript书籍中,它提供了一个方便的函数,可以帮助排序方法以正确的顺序输出值(对于数字)

var值=[0,1,5,10,15];
value.sort();
console.log(值)//输出0,1,10,15,5
功能比较(值1、值2){
如果(值1<值2){
返回-1;
}否则如果(值1>值2){
返回1;
}否则{
返回0;
}
var值=[0,1,5,10,15];
排序(比较);
console.log(值);//输出0,1,5,10,15
我知道最终会发生什么,但对于“compare”函数是如何实现的,我有点困惑!主要是因为我不确定“compare”函数的返回值是如何影响数组的! 谢谢朋友们!

来自:

如果提供了
compareFunction
,则会对数组元素进行排序 根据比较函数的返回值。如果
a
b
如果要比较两个要素,则:

  • 如果
    比较函数(a,b)
    小于
    0
    ,则将
    a
    排序为比
    b
    更低的索引,即
    a
    排在第一位
  • 如果
    compareFunction(a,b)
    返回
    0
    ,则保持
    a
    b
    彼此不变,但根据所有不同的属性进行排序 注意:ECMAscript标准不能保证这一点 行为
  • 如果
    compareFunction(a,b)
    大于
    0
    ,则将
    b
    排序为低于
    a
    的索引
然后,如果要对数字进行排序,可以使用

[0,1,5,10,15].sort(function(a,b) {
    return a-b;
});

将自定义比较函数传递给
.sort()
函数时,它使用该函数确定数组中任意两个元素中的哪一个位于另一个元素之前或之后。更详细地说,
.sort()
使用一种算法将数组中的所有元素与其他元素进行比较,每次需要知道数组中的元素A或元素B是先属于其他元素时,都会调用自定义函数。当它收集有关数组中各个元素如何相互比较的信息时,它会将数组放入排序的ord中呃

这样做的好处是,排序数组的内务管理细节和算法完全在
.sort()内部完成
函数,您只需提供比较逻辑即可实现自定义排序顺序。当您决定返回正、0或负的返回值时,这就是比较函数告诉
.sort()
函数传递给它的两个值中的哪一个属于数组和
sort()
函数使用该信息将项目按正确的顺序放入最终排序的数组中。具体操作方式取决于实际使用的排序算法

如果您想知道
.sort()
在内部是如何工作的,那么它的细节取决于特定的javascript实现,但它讨论了其中一些细节,并使用了诸如mergesort和quicksort之类的术语,这是众所周知的排序算法


javascript回调设计的美妙之处在于,您可以使用
.sort()
并提供自定义比较函数来创建自己的排序顺序,而不必知道
.sort()
的内部细节是如何实际工作的。

这就是
排序()的方式
已定义。您为什么感到困惑?您正在将
compare
传递给
sort
,它在内部调用该函数。如果a大于b,传递给
sort
的函数必须返回一个值>0,如果两个值相等,则返回0,这可能会对您有所帮助。我认为这并没有回答OP的问题。谢谢!让我感到困惑的是没有his:如果没有显式地将值声明为参数,JS是否会删除值?在比较函数
中(value1,value2)
它们只有两个,'value1'和'value2'。我不明白比较函数是如何接收数字数组的…@antoniortiz-比较函数一次只接收两个数组元素以进行比较。它对数组一无所知。
.sort()
logic处理数组本身。就好像你在这里按大小将一堆岩石按顺序分类,你有一个助手,对于每一对岩石,你都会问助手:“嘿,鲍勃,这两个岩石中哪一个更大?”Bob会告诉你是哪一个。然后你会告诉你这些信息来整理岩石。Bob对岩石的整体线条一无所知,你也知道如何比较大小,但你们两个可以做这项工作。
[0,1,5,10,15].sort(function(a,b) {
    return a-b;
});