Optional parameters in JavaScript
问题
为可选参数分配默认值的好方法是什么?
背景我正在使用JavaScript中的可选参数,如果没有指定参数,我还想指定一个默认值。我讨论的方法接受两个参数,后者我认为是可选的,如果未指定,则默认为
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 ? |
尽你所能,结果不尽相同,也不理想。
预期如果参数未指定,是否有其他方法可以将默认值分配给可选参数;最好使用
更好的解决方案是使用包装在对象中的命名参数。它使代码保持干净,并防止复杂函数(有许多默认参数和非默认参数)出现错误。否则,您需要记住参数的顺序,并根据当前参数的类型(这正是您要做的)分配默认值。
该方法是传递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(可选参数)(因为您只想检查它的存在性)。或者,您也可以强制使用像这样的布尔值
一种非常简单的方法来检查切换是否未定义,如果未定义,则设置默认值:
请注意,如果指定了
换个角度试试:
1 | param = typeof param === 'boolean' && param; |
这将确保所有的都是布尔值,看这个小提琴
如果您认为
1 | toggle = toggle&&toggle||default_value |
现在,如果您将
你可以代替
1 | param = param && typeof param === 'boolean'; |
具有
1 | param = !!(param && typeof param === 'boolean'); |
这将把语句的结果转换为布尔求反,然后再次求反。
如果希望得到其他结果,为什么要将参数检查为布尔值?通常的方法是检查
1 | toggle = Boolean(toggle); |
应该完成任务。您也可以使用快捷方式
1 2 | if (toggle) { // will evaluate to"false" for undefined ... |
顺便说一句,不需要
它可以很容易地用arguejs完成:
1 2 3 4 5 6 7 8 | this.selectItem = function() { arguments = __({item: undefined, toggle: [Boolean, false}) if (arguments.toggle) { // ... } } |
您还可以通过按所需类型更改
看看jquery extend以及它们如何处理可选参数。