javascript中的可选参数

Optional parameters in JavaScript

本问题已经有最佳答案,请猛点这里访问。

问题

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

背景

我正在使用JavaScript中的可选参数,如果没有指定参数,我还想指定一个默认值。我讨论的方法接受两个参数,后者我认为是可选的,如果未指定,则默认为false。我的方法看起来像这样…

1
2
3
4
5
6
7
8
9
10
// 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上运行了一些测试之后,使用以下原则分配默认值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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


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

该方法是传递params jquery和jquery插件的主要方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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


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

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

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

1
2
3
4
5
this.selectItem = function(item, toggle)
{
    toggle = toggle || false;
   // ...
}

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


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

if (toggle === undefined) toggle ="";

请注意,如果指定了toggle,但它的类型与您预期的不同,则不会发生变化。


换个角度试试:

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

这将确保所有的都是布尔值,看这个小提琴


如果您认为null""是"没有参数传递给我的函数",请使用以下语句:

1
toggle = toggle&&toggle||default_value

现在,如果您将nullundefined""传递给您作为togglearg的函数,这行将用default_value填充它。


你可以代替

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

具有

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

这将把语句的结果转换为布尔求反,然后再次求反。


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

1
toggle = Boolean(toggle);

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

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

顺便说一句,不需要_toggle参数;您只需重新分配到toggle即可。


它可以很容易地用arguejs完成:

1
2
3
4
5
6
7
8
this.selectItem = function()
{
  arguments = __({item: undefined, toggle: [Boolean, false})
  if (arguments.toggle)
  {
     // ...
  }
}

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


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