32

问题

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

背景

我正在玩 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)
    {
       // ...
    }
}

测试

此 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方法内会更好吗?

4

9 回答 9

23

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

该方法是传递参数jQuery 和 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
于 2012-06-14T09:24:00.770 回答
14

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

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

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

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

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

于 2012-06-14T09:30:05.383 回答
4

检查切换是否未定义的一种非常简单的方法,如果未定义,则设置默认值:

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

toggle请注意,如果它被指定但与您预期的类型不同,这不会改变。

于 2012-06-14T09:16:29.560 回答
2

换个方式试试:

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

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

于 2012-06-14T09:20:44.177 回答
1

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

toggle = Boolean(toggle);

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

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

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

于 2012-06-14T09:20:24.767 回答
1

你可以更换

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

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

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

于 2012-06-14T09:24:37.633 回答
1

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

toggle = toggle&&toggle||default_value

null现在,如果您将undefined""作为togglearg 传递给您的函数,则此行将用default_value.

于 2012-06-14T10:12:52.293 回答
0

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

于 2012-06-14T09:28:28.503 回答
0

它可以通过 ArgueJS 轻松完成

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

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

于 2013-04-12T16:38:24.450 回答