为什么Javascript Array.sort函数在不正确的比较函数时不会抛出错误

时间:2015-08-12 12:04:35

标签: javascript

为什么Javascript Array.sort函数在将不正确的比较函数(即带有参数数量的函数!= 2)传递给它进行排序时不会抛出错误。根据我的理解,sort函数具有可选的compareFunction函数。此函数需要2个参数。

示例1:compareFunction与1个参数

var ar = [1,4,2,3];
console.log(ar.sort(function(a){return 2-a;}));

控制台上的输出

VM239:2 [4, 2, 3, 1]

示例2:compareFunction与2参数

var ar = [1,4,2,3];
console.log(ar.sort(function(a,b,c){return a-b-c;}));

控制台上的输出

VM408:2 [1, 4, 2, 3]

4 个答案:

答案 0 :(得分:1)

您可以使用任意数量的参数重载函数,因为参数来自函数的'arguments arraylike object'。所有额外参数都被忽略,因此您的sort函数不会为它抛出错误。 对于这些事情,Javascript非常灵活。 :)

答案 1 :(得分:1)

由于JavaScript没有其他语言中存在的概念,例如"方法重载",发送到方法的参数只被分配给名为arguments的特殊对象数组,您可以直接访问,或者只是在函数声明中为每个预期值的位置使用变量。

即:

具有如下功能:

function sum(){
  var t = 0;
  for(var i = 0; i < arguments.length;i++){
    t = t + arguments[i];
  }
  return t;
}

允许您调用以下函数:

sum();
sum(1,2);
sum(1,2,3);

答案 2 :(得分:1)

Javascript中的函数忽略(除了特殊变量参数)任何其他参数,任何缺少的参数都取值undefined。这意味着对于定义的函数

function lol(a, b) {
    console.log(a);
    console.log(b);
}

您也可以这样称呼它

lol(1, 2, 3);

并且JavaScript只会忽略第3个参数而不会出错。它会输出

1  
2

你可以这样称呼它

lol(1);

并且JavaScript不会出错。参数b将取值undefined,控制台将显示

1  
undefined

请注意,在所有情况下,您都可以使用函数中的特殊变量arguments来访问参数的数量和额外的参数

看看你的例子,发生了什么

var ar = [1,4,2,3];
console.log(ar.sort(function(a){return 2-a;}));

b缺少,但功能不会介意。

var ar = [1,4,2,3];
console.log(ar.sort(function(a,b,c){return a-b-c;}));

c总是undefined,但函数不会介意。

关于效果,返回值(2 - a)和NaN分别对实际排序Bergi's answer进行了解释(最后一段)

答案 3 :(得分:0)

我发现这个有用的信息可以准确描述内部的javascript来回答问题

sf::RenderWindow window(sf::VideoMode(800, 600), "text");
bool WINDOW_HAS_FOCUS = false;

while(window.isOpen())
{

    sf::Event event;
    while(window.pollEvent(event))
    {

        if(event.type == sf::Event::LostFocus)
        {
            WINDOW_HAS_FOCUS = false;
        }
        else if(event.type == sf::Event::GainedFocus)
        {
            WINDOW_HAS_FOCUS = true;
        }

    }

    // ... later in program ...

    if(WINDOW_HAS_FOCUS)
    {
        // do something
    }

    window.clear();
    // etc drawing code
}