sort()a和b变量中的JavaScript回调函数

Rob*_*cha 6 javascript

我试图理解该sort()函数如何与传递给它的回调函数一起工作.更具体地说,a和的值b

示例代码:

var n = [4, 11, 2, 10, 3, 1];
    n.sort(function(a, b) {
        console.log(a);
        console.log(b);
        console.log('--')
        return a-b;
    });
Run Code Online (Sandbox Code Playgroud)

结果:

4
11
--
11
2
--
4
2
--
11
10
--
4
10
--
11
3
--
10
3
--
4
3
--
2
3
--
11
1
--
10
1
--
4
1
--
3
1
--
2
1
--
Run Code Online (Sandbox Code Playgroud)

第一轮我可以跟随a= 4,b= 11,很容易遵循.

第二轮我可以跟随a= 11和b= 2.

但在那之后,我对实际发生的事情进行了一些松散的跟踪,例如当你到达a= 4和b= 3时.这实际上是如何工作的?我尝试在纸上完成它,但无法看到输出中的逻辑ab.

Jun*_*711 1

你可以这样看。当你有两个数字时,比较 a(前一个)和 b(下一个)。
\n如果a大于b,则将其放在b后面。
\n如果a小于b,则将其放在b之前。
\n事实上,当你遇到“a > b”的情况时,你可以返回任何正数:将 a 放在 b 之后。
\n并且,当出现“a < b”情况时,您可以返回任何负数:将 a 放在 b 之前。\n它本质上是一次比较 2 个数字。

\n\n

数组中的位置可以理解如下。\n从以下角度来看return a-b,如果返回负数,则将 a 放在 b 之前;如果返回正数,则将 a 放在 b 之后。\n负数 - 零 - 正数。

\n\n

也许,你可以通过在运行时打印出n中的内容来更好地理解它。

\n\n
window.n = [4, 11, 2, 10, 3, 1];\nn.sort(function(a, b) {\n    console.log(a);\n    console.log(b);\n    console.log(window.n); // You can see what is in n in the every comparison\n    console.log('--')\n    return a-b;\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

Chrome v64.0.3282 上的结果

\n\n
4\n11\n(6)\xc2\xa0[4, 11, 2, 10, 3, 1]\n--\n11\n2\n(6)\xc2\xa0[4, 11, 2, 10, 3, 1]\n--\n4\n2\n(6)\xc2\xa0[4, 11, 11, 10, 3, 1]\n--\n11\n10\n(6)\xc2\xa0[2, 4, 11, 10, 3, 1]\n--\n4\n10\n(6)\xc2\xa0[2, 4, 11, 11, 3, 1]\n--\n11\n3\n(6)\xc2\xa0[2, 4, 10, 11, 3, 1]\n--\n10\n3\n(6)\xc2\xa0[2, 4, 10, 11, 11, 1]\n--\n4 \n3\n(6)\xc2\xa0[2, 4, 10, 10, 11, 1]\n--\n2\n3\n(6)\xc2\xa0[2, 4, 4, 10, 11, 1]\n--\n11\n1\n(6)\xc2\xa0[2, 3, 4, 10, 11, 1]\n--\n10\n1\n(6)\xc2\xa0[2, 3, 4, 10, 11, 11]\n--\n4\n1\n(6)\xc2\xa0[2, 3, 4, 10, 10, 11]\n--\n3\n1\n(6)\xc2\xa0[2, 3, 4, 4, 10, 11]\n--\n2\n1\n(6)\xc2\xa0[2, 3, 3, 4, 10, 11]\n--\n\n(6)\xc2\xa0[1, 2, 3, 4, 10, 11] // result\n
Run Code Online (Sandbox Code Playgroud)\n\n

您的代码返回与以下相同的结果:

\n\n
var n = [4, 11, 2, 10, 3, 1];\nn.sort(function(a, b) {\n    console.log(a);\n    console.log(b);\n    console.log('--')\n    if (a > b) {\n        return 1;\n    } else {\n        return -1;\n    }  \n});\n(6)\xc2\xa0[1, 2, 3, 4, 10, 11] // result\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
var n = [4, 11, 2, 10, 3, 1];\nn.sort((a, b) => a > b ? 1 : -1);\n(6)\xc2\xa0[1, 2, 3, 4, 10, 11] // result\n
Run Code Online (Sandbox Code Playgroud)\n