【问题标题】: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)

【问题讨论】:

    标签: javascript parameters default-value


    【解决方案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】:

        Similarrelated 之前已经提出过问题。

        【讨论】:

          【解决方案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";
                    }
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-06-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-08-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多