为可选参数指定默认值的好方法是什么?
我正在使用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
吗?
答案 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)
答案 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
现在,如果您将null
,undefined
或""
作为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
的类型。