JavaScript中的可选参数

时间:2012-06-14 09:13:37

标签: javascript

问题

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

背景

我正在使用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吗?

9 个答案:

答案 0 :(得分:22)

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

该方法是传递params 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

答案 1 :(得分:14)

您可以在代码中使用此构造作为可选参数:

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

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

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

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

答案 2 :(得分:4)

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

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

请注意,如果指定了toggle,但这种情况不会改变,但不会改变您预期的其他类型。

答案 3 :(得分:2)

反过来试试:

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

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

答案 4 :(得分:1)

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

toggle = Boolean(toggle);

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

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

BTW,不需要_toggle参数;您可以重新分配到toggle

答案 5 :(得分:1)

您可以替换

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

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

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

答案 6 :(得分:1)

如果,您认为null(以及没有传递args),undefined""(空字符串)为&#34; 没有一个参数传递给我的函数&#34;使用此声明:

toggle = toggle&&toggle||default_value

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

可以使用ArgueJS轻松完成:

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

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