代码之家  ›  专栏  ›  技术社区  ›  chills42

在javascript中设置默认参数值的最有效方法是什么?

  •  3
  • chills42  · 技术社区  · 16 年前

    function Foo(par1, par2)
    {
        if(par2 == null)
            par2 = "my default"
    }
    

    function Foo(par1, par2)
    {
        par2 = par2 || "my default"
    }
    

    还是有比这两种方法更好的方法?

    编辑:

    我还想知道其他人如何处理多个可选参数,例如: 我们在内部库中有几个类似的函数(我认为它们非常难看)。

    function Foo(par1, par2, par3)
    {
        if(par2 == null)
            par2 = "my default"
        if(par3 == null)
            par3 = "my default"
        // Do something
    }
    

    Foo("Parameter one",null,true)
    
    11 回复  |  直到 16 年前
        1
  •  5
  •   jishi    16 年前

    第一个是错误的,因为它们是未定义的,不是空的。

    par2 !== null 对于这种情况,将返回true。

    由于javascript,如果比较松散,将null、undefined、false与相同的值进行比较,我建议显式检查未定义的值。

    if (par2 !== undefined)
            par2 = "my default";
    

        par2 = par2 !== undefined ? par2 : "my default";
    

    然而,第二种方法很方便,但只有在您知道永远不会传递false或null的情况下。

        2
  •  4
  •   Sergey Ilinsky    16 年前

    更好、更可靠的方法是:

    1) 验证传递的参数数量(假设您希望允许传入未定义的值,或null,就像DOM insertBefore函数的情况一样),并且仅在此之后,如果ommited,请尝试设置其值:

    function Foo(par1, par2)
    {
        if (arguments.length < 2)
            par2 = "my default"
        else
        if (arguments.length < 3)
            par3 = "my default"
    }
    

    2) 或者,如果要禁止未定义的传递,请将其包含在构造中:

    function Foo(par1, par2)
    {
        if (arguments.length < 2 && par2 === undefined)
            par2 = "my default"
        else
        if (arguments.length < 3 && par3 === undefined)
            par3 = "my default"
    
    }
    

    3) 或者,如果不允许传递null,请将其包含在构造中:

    function Foo(par1, par2)
    {
        if (arguments.length < 2 && (par2 === undefined || par2 === null))
            par2 = "my default"
        else
        if (arguments.length < 3 && (par3 === undefined || par3 === null))
            par4 = "my default"
    }
    

        3
  •  3
  •   mat    16 年前

    我通常使用第二个,因为它增加的信号较少。

        4
  •  2
  •   annakata    16 年前

    就我个人而言,我认为第二种形式更干净、可读性更强,当然比sergey的参数检查更清晰——尽管这可能有它的位置——但我更喜欢为arg传递可扩展对象,而不是维护arg签名。

    例如

    function Foo(myArgs)
    {
        myArgs.par1 = myArgs.par1 || "my default"
        myArgs.par2 = myArgs.par2 || "my default"
    }
    
        5
  •  2
  •   Pablo Cabrera    16 年前

    这个怎么样:

    function myFunc(arg1, arg2, arg3) {
        switch (arguments.length) {
            case 0 : arg1 = "default1";
            case 1 : arg2 = "default2";
            case 2 : arg3 = "default3";
        }
    }
    
        6
  •  1
  •   Grant Wagner    16 年前

    我所做的选择取决于参数类型和所需的默认值。

    例如,如果par2为false、0、空字符串、null或未定义,则这将分配“默认值”:

    par2 = par2 || 'default value';
    

    这种行为可能不是预期的或需要的。

        7
  •  1
  •   Community CDub    7 年前

    Similar related 以前有人问过问题。

        8
  •  0
  •   Logan Serman    16 年前

    没听说过你提到的第二种方式,很有趣。我会:

    function Foo(par1, par2)
    {
        par2 = par2 ? par2 : 'default value';
    }
    

    但是现在你让我注意到了你的第二种方法,我想我会使用它,因为它打字更少。

        9
  •  0
  •   Pim Jager    16 年前

    如果使用jquery,可以执行以下操作:

    function foo(params){
     var params = $.extend({}, {bar: '2'}, params);
     alert(params.bar);
    }
    foo(); //Alerts 2
    
        10
  •  0
  •   epascarello    16 年前

    当你使用

    var foo=bar | | 123;

    是计算为false的条形图的值。这可能会给你带来麻烦。

    埃里克

        11
  •  0
  •   Luca Matteis    16 年前

    function myFunc() {
        arguments[0] = arguments[0] || "default value for first argument";
        arguments[3] = arguments[3] || "default value for fourth argument";
        alert(arguments[3]);
    }