【问题标题】:Optional parameters in JavaScript [duplicate]JavaScript中的可选参数[重复]
【发布时间】:2012-06-17 07:18:40
【问题描述】:

问题

为可选参数分配默认值的好方法是什么?

背景

我正在玩 JavaScript 中的 可选 参数,以及在未指定参数时分配默认值的想法。我的方法接受两个参数,我认为后者是可选的,如果未指定应默认为false。我的方法看起来像这样......

// selects the item, appropriately updating any siblings
// item to select [, toggle on / off]
this.selectItem = function(item, toggle)
{
    toggle = toggle && typeof toggle === 'boolean';
    if (toggle)
    {
       // ...
    }
}

测试

this jsFiddle 上运行一些测试后,使用以下主体进行默认值分配:

function checkParamIsBoolean(param)
{
    param = param && typeof param === 'boolean';
}

checkParamIsBoolean('me'); // boolean
checkParamIsBoolean([]); // boolean
checkParamIsBoolean(true); // boolean
checkParamIsBoolean(false); // boolean
checkParamIsBoolean(1 == 1); // boolean
checkParamIsBoolean(1); // boolean
checkParamIsBoolean(null); // object
checkParamIsBoolean(undefined); // undefined
​

尽你所能,结果各不相同,而且不是我们想要的。

预期

null = false
undefined = false

实际

null = object
undefined = undefined

总结

如果未指定,是否有任何替代方法可以将默认值分配给可选参数?使用_toggle作为参数,然后在方法中将值赋给var toggle会更好吗?

【问题讨论】:

  • 已经有很多关于这个话题的相关问题(example)。看看右侧的所有内容。如果你问为什么没有得到预期的结果,这是因为 nullundefined 是假的,布尔运算符返回决定表达式结果的变量的值。
  • 你说你想为可选参数使用默认值,但只有最后一次调用checkParamIsBoolean 没有设置参数。所有其他调用,即使您使用 null 作为参数,也在为参数设置一个值。
  • 除了 Felix 的评论,我想补充一点 null 是类型对象的值。将null 指定为参数与未指定的参数不同。顺便说一句,调用该方法的另一种方式是checkParamIsBoolean();(这与您上一个示例基本相同)

标签: javascript


【解决方案1】:

更好的解决方案是使用包装在对象中的命名参数。它使您的代码保持干净并防止在复杂函数(具有许多默认和非默认参数)的情况下出现错误。否则,您需要记住参数的顺序并根据存在的参数类型分配默认值(这就是您想要做的)。

该方法是传递参数jQuery and jQuery's plugins 的主要方式。

function test(options) { 

  // set up default options 
  var defaults = { 
    param1:      'test', 
    param2:      100
  }; 

  // combine options with default values
  var options = $.extend({}, defaults, options); // If you're not using jQuery you need different function here

  alert(options.param1)
  alert(options.param2)

}

test({'param2': 200}) // Call the function with just the second param

【讨论】:

  • 你确实有一个好点。但是,我认为学习参数的顺序通常比学习参数的名称更容易,在这种情况下你需要知道。 (最大的例外是 PHP 的针叶草堆,我记不住顺序)。
  • 我不知道是不是只有我一个人,但是当“如果你不使用 Jquery...”的评论开始滚出屏幕时,我完全期待阅读“。 .. 你做错了。”当我滚动过去时。
  • 我确信@JHixson 只是觉得这很有趣。当当。
  • @Secator 确实,它只是让我笑了=)
【解决方案2】:

您可以将此构造用于代码中的可选参数:

//...
optionalParam = optionalParam || 'some default value';

在你的具体例子中,它会是这样的:

this.selectItem = function(item, toggle)
{
    toggle = toggle || false;
   // ...
}

但在您的情况下,您可以直接在 if 语句中使用 toogle(可选参数)(因为您只想检查它是否存在。或者您可以选择强制执行布尔值,例如 toogle = !!toogle(双重否定)。

【讨论】:

  • 如果我想要 true 作为默认值并且我的参数是 false 那么我会得到 true
  • @Thomas 那么你可以使用这样的构造:toggle = (arguments.length < 2) || toggle;。无论如何,应该谨慎使用 JS 中的所有这些“快捷方式”,并清楚地了解所有可能的后果(我想这就是为什么在 ES6 中引入 default parameters :))
【解决方案3】:

一个非常简单的方法来检查toggle是否未定义,如果它被设置一个默认值:

if (toggle === undefined) toggle = "<your default value>";

请注意,如果指定了 toggle,但它的类型与您预期的不同。

【讨论】:

  • === undefined 在 Chrome 39 中不起作用。
【解决方案4】:

换一种方式试试:

param = typeof param === 'boolean' && param;

这将确保所有都是布尔值,请参阅this fiddle

【讨论】:

    【解决方案5】:

    如果您期望其他结果,为什么要检查参数是否为布尔值?通常的方法是检查typeof toggle != "undefined",但在你的情况下

    toggle = Boolean(toggle);
    

    应该完成任务。也可以使用快捷方式!!toggle,或者直接在if子句中使用:

    if (toggle) { // will evaluate to "false" for undefined
        ...
    

    顺便说一句,不需要_toggle 参数;你可以重新分配给toggle

    【讨论】:

      【解决方案6】:

      你可以替换

      param = param && typeof param === 'boolean';
      

      param = !!(param && typeof param === 'boolean');
      

      这会将语句的结果转换为布尔否定,然后再次否定它。

      【讨论】:

        【解决方案7】:

        如果您认为null(以及没有传递参数)、undefined""(空字符串)为“没有参数传递给我的函数”使用这个语句:

        toggle = toggle&&toggle||default_value
        

        现在,如果您将 nullundefined"" 作为 toggle arg 传递给您的函数,则此行将使用 default_value 填充它。

        【讨论】:

          【解决方案8】:

          看看jQuery extend 以及它们如何处理可选参数。

          【讨论】:

            【解决方案9】:

            ArgueJS 可以轻松完成:

            this.selectItem = function()
            {
              arguments = __({item: undefined, toggle: [Boolean, false})
              if (arguments.toggle)
              {
                 // ...
              }
            }
            

            您还可以通过将undefined 更改为所需的类型来检查item 的类型。

            【讨论】:

              猜你喜欢
              • 2021-10-20
              • 2017-01-01
              • 2016-03-27
              • 1970-01-01
              • 2013-06-12
              • 2010-12-16
              • 2012-01-03
              • 1970-01-01
              • 2013-11-03
              相关资源
              最近更新 更多