【问题标题】:Default value for function parameter?函数参数的默认值?
【发布时间】:2011-04-09 23:33:56
【问题描述】:

所以我从记事起就一直这样做,但我很好奇这是否真的是我应该做的。您编写了一个带有参数的函数,因此您期望它有一个值,但如果没有,您有充分的理由默认它,例如为零。我目前所做的是编写一个辅助函数:

function foo() { return foo(0); };
function foo(bar) { ... };

我刚刚遇到了一个我这样做的实例,我奇怪地看了它几秒钟,然后才理解了我背后的逻辑。我来自微不足道的php:

function foo(bar=0) { ... }

是否有我不知道的 javascript 替代方案?

【问题讨论】:

标签: javascript


【解决方案1】:

在 JavaScript 中,如果用户没有传入参数,参数将是未定义的。您可以使用 ||如果参数未定义,则运算符设置参数的值:

function foo(bar) {
  bar = bar || 0;
  ...
}

【讨论】:

  • 你最好检查 bar === undefined 而不是做这个简单的测试。
  • @jrharshath 我只是发现variable===undefined 是错误的,因为 undefined 实际上是一个未定义的变量,而不是保留字。所以如果你之前分配undefined=true; 然后测试alert(x===undefined) //returns false 所以你应该使用typeof variable===undefined 输入检查
  • 这个答案是错误的,因为你不能传递 0 或 false 或 null。示例:如果 bar 默认为 true 像这样bar = bar || true 你不能传递 false,bar 将永远为 true。
  • @Vitim.us undefined 已修复 ECMAScript 5,See 15.1.1.3,2009 年发布 implementation chart, look for Immutable undefined Annie 的答案是错误的,因为您在上面给出的原因 (0,false,null)。
【解决方案2】:

您不能在 JavaScript 中使用重载函数。相反,使用基于对象的初始化,或检查值并在未提供时分配默认值。

在您的示例中,第二个函数 foo(bar) 将替换第一个函数。

这是一个使用对象初始化的函数。

function foo(config) {
    extend(this, config);
}

其中extend 是一个将配置对象与当前对象合并的函数。类似于jQuery中的$.extend方法,或者MooTools的$extend方法。

调用函数并将命名键值对传递给它

foo({ bar: 0 });

另一种初始化方法是查看提供的值,如果没有给出值,则分配默认值

function foo(bar) {
    bar = bar || 0;
}

只要 bar 不是一个虚假值,它就可以工作。所以foo(false)foo("") 仍会将bar 初始化为0。对于这种情况,请进行明确的检查。

function foo(bar) {
    bar = (typeof bar == 'undefined' ? 0 : bar);
}

【讨论】:

    【解决方案3】:

    我知道的最简单的方法是测试一个值,如果没有找到值,则将其设置为默认值。我还没有遇到一个全能的班轮,这是我所拥有的最好的。

    如果期望一个字符串值,请使用它。默认值会触发这些值:[ undefined, null, "" ]

    function foo(str) {
      str = !!str  ? str  : 'bar';
      ...
    }
    

    如果需要一个数字或布尔值。这允许 0 和 false 作为值。默认将触发 [ undefined, null, {}, functions ]

    便于制作只接受原始值(如数字、布尔值和字符串)的值参数

    function foo(val) {
      val= !!val == val || val*1 ? val : 10;
      ...
    }
    

    如果您要测试 {} 之类的对象,可以参考相关文档,但并不那么简单。

    【讨论】:

      【解决方案4】:

      希望这对某人来说更清楚一些 - 我最终使用 ol' 检查未定义的if(typeof functionparameter !== 'undefined')

      $.fn.extend({
          doThing: function(stringparameter = 'FooBar!', functionparameter){
              console.log('Here is your string '+stringparameter);
              // Run it if it's been passed through:
              if(typeof functionparameter !== 'undefined') functionparameter();
      });
      

      【讨论】:

        猜你喜欢
        • 2011-02-20
        • 2010-11-28
        • 1970-01-01
        • 2019-09-11
        • 2012-08-03
        • 2015-07-08
        • 2011-08-26
        • 1970-01-01
        相关资源
        最近更新 更多