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

Posted

技术标签:

【中文标题】在javascript中设置默认参数值的最有效方法是啥?【英文标题】:What is the most efficient method of setting default parameter values in javascript?在javascript中设置默认参数值的最有效方法是什么? 【发布时间】:2010-10-02 11:06:18 【问题描述】:

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

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)

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

function Foo(par1, par2)

    par2 = par2 ? par2 : 'default value';

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

【讨论】:

猜数字 或值 和许多其他将被错误地对待。 对于 par2=false 和默认值 = true 不起作用。如下使用未定义【参考方案3】:

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

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

foo(); //Alerts 2

【讨论】:

【参考方案4】:

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

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

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

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

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

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

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

【讨论】:

提问者使用 ==,而不是 ===。所以第一个例子其实没有错。 它会起作用,但在他不知道他实际匹配什么的意义上这是错误的。【参考方案5】:

Similar 和 related 之前已经提出过问题。

【讨论】:

【参考方案6】:

更好、更可靠的方法是:

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

函数 Foo(par1, par2) if (arguments.length

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

函数 Foo(par1, par2) if (arguments.length

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

函数 Foo(par1, par2) if (arguments.length

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

【讨论】:

如果您的函数确实接受 null, undefined, 0, '' 作为参数,那就太好了 Pim,问题很笼统,没有关于值的详细信息,对吧? 这不是批评。我只是说,如果您的函数不希望这些值作为参数,那么您并不真正需要它。 (我也赞成您的回答,因为对于这些情况来说,这确实是一个很好的答案。)【参考方案7】:

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

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

par2 = par2 || 'default value';

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

【讨论】:

【参考方案8】:

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

例如

function Foo(myArgs)

    myArgs.par1 = myArgs.par1 || "my default"
    myArgs.par2 = myArgs.par2 || "my default"

【讨论】:

如果你的论点代表一个虚假值怎么办? 好问题。我会在重要的地方使用类似于 jishi 的三元 - 但大多数情况下我发现 falsys 默认值,或者根本是有问题的值。有点不确定为什么我在这个 tbh 上被接受了,因为我真的用对象 arg 技术扩展了其他正确的答案:) 无需定义 myArgs 变量。已经有一个内部参数变量:参见ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf中的第 10.1.8 节 @some - 我很清楚这一点,但是创建您自己的类可以让您对数据进行集中的可重用控制,为您提供廉价的验证、默认值、接近类型安全的东西(如果您愿意的话),并且提高可读性。相比之下,参数 var 确实是一个相当模糊和笨拙的参数。 哦,更进一步 - arguments[n] 与 myArgs.foo 几乎不一样【参考方案9】:

使用解决方案时你要考虑的一件事

var foo = bar || 123;

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

埃里克

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

这个呢:

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

【讨论】:

以上是关于在javascript中设置默认参数值的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中设置自定义 NavigationBar 的最简单方法是啥?

JSON.net,C#,无法在数据模型中设置默认值

如何在 Grails 2.2 中设置域类值的默认值?

Golang中设置函数默认参数的优雅实现

在 Python 中设置枚举的最简洁方法是啥? [复制]

如何在 laravel 的 javascript 代码中设置路由名称