3

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

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)
4

11 回答 11

5

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

par2 !== null在这种情况下将返回 true。

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

如果 (par2 !== 未定义)
        par2 = "我的默认值";

或者

    par2 = par2 !== 未定义?par2 : "我的默认值";

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

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

于 2009-01-20T14:16:19.127 回答
4

更好和更可靠的方法是:

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

函数 Foo(par1, par2)
{
    if (arguments.length < 2)
        par2 = "我的默认值"
    别的
    if (arguments.length < 3)
        par3 = "我的默认值"
}

2) 或者,如果您想禁止传递 undefined,请将其包含在构造中:

函数 Foo(par1, par2)
{
    if (arguments.length < 2 && par2 === 未定义)
        par2 = "我的默认值"
    别的
    if (arguments.length < 3 && par3 === 未定义)
        par3 = "我的默认值"

}

3) 或者,如果您想禁止传递 null,请将其包含在构造中:

函数 Foo(par1, par2)
{
    if (arguments.length < 2 && (par2 === undefined || par2 === null))
        par2 = "我的默认值"
    别的
    if (arguments.length < 3 && (par3 === undefined || par3 === null))
        par4 = "我的默认值"
}

顺便说一句:我建议避免使用函数重载,实际上几乎没有必要。

于 2009-01-20T14:16:52.963 回答
3

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

于 2009-01-20T14:10:28.433 回答
2

就我个人而言,我认为第二种形式更简洁、更易读,当然比 sergey 的参数检查更重要——尽管它可以占据一席之地——但我更喜欢为 args 传递可扩展对象,而不是必须维护 arg 签名。

例如

function Foo(myArgs)
{
    myArgs.par1 = myArgs.par1 || "my default"
    myArgs.par2 = myArgs.par2 || "my default"
}
于 2009-01-20T14:33:41.507 回答
2

这个如何:

function myFunc(arg1, arg2, arg3) {
    switch (arguments.length) {
        case 0 : arg1 = "default1";
        case 1 : arg2 = "default2";
        case 2 : arg3 = "default3";
    }
}
于 2009-01-21T10:57:54.453 回答
1

之前已经提出过类似相关的问题。

于 2009-01-20T14:16:25.600 回答
1

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

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

par2 = par2 || 'default value';

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

于 2009-01-20T14:17:00.903 回答
0

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

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

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

于 2009-01-20T14:10:29.747 回答
0

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

function foo(params){
 var params = $.extend({}, {bar: '2'}, params);
 alert(params.bar);
}
foo(); //Alerts 2
于 2009-01-20T14:14:04.620 回答
0

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

var foo = 酒吧 || 123;

是什么 bar 的值评估为 false。它可能会给你带来麻烦。

埃里克

于 2009-01-20T15:05:29.230 回答
0

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

function myFunc() {
    arguments[0] = arguments[0] || "default value for first argument";
    arguments[3] = arguments[3] || "default value for fourth argument";
    alert(arguments[3]);
}
于 2009-01-20T15:06:07.980 回答