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

时间:2009-01-20 14:05:08

标签: javascript parameters default-value

我知道有两种设置默认参数的方法,但我想知道首选方法是什么。

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 个答案:

答案 0 :(得分:5)

第一个实际上是错误的,因为它们将是未定义的,而不是空的。

对于这种情况,

par2 !== null将返回true。

因为javascript,如果松散比较,将null,undefined,false比较为相同的值,我建议明确检查未定义的值。

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

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

这将允许您传递false或null等值。

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

答案 1 :(得分:4)

更好,更可靠的方法是:

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)或者,如果您想禁止传递undefined,请将其包含在构造中:

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"
}

BTW:我建议避免使用函数重载,实际上几乎没有必要。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

就我个人而言,我认为第二种形式只是彻底清晰,更具可读性,当然比sergey的参数检查更多 - 虽然可以有它的位置 - 但我更喜欢传递args的可扩展对象,而不是维护arg签名。

e.g。

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

答案 4 :(得分:2)

这个怎么样:

function myFunc(arg1, arg2, arg3) {
    switch (arguments.length) {
        case 0 : arg1 = "default1";
        case 1 : arg2 = "default2";
        case 2 : arg3 = "default3";
    }
}

答案 5 :(得分:1)

之前已经提出了{p> Similarrelated个问题。

答案 6 :(得分:1)

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

例如,如果par2为false,0,空字符串,null或undefined,则会分配'default value':

par2 = par2 || 'default value';

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

答案 7 :(得分:0)

从未听说过你提到的第二种方式,这很有趣。我愿意:

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

但是现在你引起我的注意了你的第二种方法,我想我会使用它只是因为它不那么打字。

答案 8 :(得分:0)

如果你使用jquery,你可以这样做:

function foo(params){
 var params = $.extend({}, {bar: '2'}, params);
 alert(params.bar);
}
foo(); //Alerts 2

答案 9 :(得分:0)

使用

解决方案时必须考虑的一件事

var foo = bar || 123;

是评估为false的bar的值。这可能会让你遇到问题。

埃里克

答案 10 :(得分:0)

如果您将许多参数传递给函数,则可以执行以下操作:

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