JavaScript中的可选参数[重复]
Posted
技术标签:
【中文标题】JavaScript中的可选参数[重复]【英文标题】:Optional parameters in JavaScript [duplicate] 【发布时间】:2012-06-17 07:18:40 【问题描述】:问题
为可选参数分配默认值的好方法是什么?
背景
我正在玩 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
会更好吗?
【问题讨论】:
已经有很多关于这个话题的相关问题(example)。看看右侧的所有内容。如果你问为什么没有得到预期的结果,这是因为null
和 undefined
是假的,布尔运算符返回决定表达式结果的变量的值。
你说你想为可选参数使用默认值,但只有最后一次调用checkParamIsBoolean
没有设置参数。所有其他调用,即使您使用 null 作为参数,也在为参数设置一个值。
除了 Felix 的评论,我想补充一点 null
是类型对象的值。将null
指定为参数与未指定的参数不同。顺便说一句,调用该方法的另一种方式是checkParamIsBoolean();
(这与您上一个示例基本相同)
【参考方案1】:
更好的解决方案是使用包装在对象中的命名参数。它使您的代码保持干净并防止在复杂函数(具有许多默认和非默认参数)的情况下出现错误。否则,您需要记住参数的顺序并根据存在的参数类型分配默认值(这就是您想要做的)。
该方法是传递参数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
【讨论】:
你确实有一个好点。但是,我认为学习参数的顺序通常比学习参数的名称更容易,在这种情况下你需要知道。 (最大的例外是 php 的针叶草堆,我记不住顺序)。 我不知道是不是只有我一个人,但是当“如果你不使用 Jquery...”的评论开始滚出屏幕时,我完全期待阅读“。 .. 你做错了。”当我滚动过去时。 我确信@JHixson 只是觉得这很有趣。当当。 @Secator 确实,它只是让我笑了=)【参考方案2】:您可以将此构造用于代码中的可选参数:
//...
optionalParam = optionalParam || 'some default value';
在你的具体例子中,它会是这样的:
this.selectItem = function(item, toggle)
toggle = toggle || false;
// ...
但在您的情况下,您可以直接在 if 语句中使用 toogle(可选参数)(因为您只想检查它是否存在。或者您可以选择强制执行布尔值,例如 toogle = !!toogle
(双重否定)。
【讨论】:
如果我想要 true 作为默认值并且我的参数是 false 那么我会得到 true @Thomas 那么你可以使用这样的构造:toggle = (arguments.length < 2) || toggle;
。无论如何,应该谨慎使用 JS 中的所有这些“快捷方式”,并清楚地了解所有可能的后果(我想这就是为什么在 ES6 中引入 default parameters :))【参考方案3】:
一个非常简单的方法来检查toggle是否未定义,如果它被设置一个默认值:
if (toggle === undefined) toggle = "<your default value>";
请注意,如果指定了 toggle
,但它的类型与您预期的不同。
【讨论】:
=== undefined
在 Chrome 39 中不起作用。【参考方案4】:
换一种方式试试:
param = typeof param === 'boolean' && param;
这将确保所有都是布尔值,请参阅this fiddle
【讨论】:
【参考方案5】:如果您期望其他结果,为什么要检查参数是否为布尔值?通常的方法是检查typeof toggle != "undefined"
,但在你的情况下
toggle = Boolean(toggle);
应该完成任务。也可以使用快捷方式!!toggle
,或者直接在if子句中使用:
if (toggle) // will evaluate to "false" for undefined
...
顺便说一句,不需要_toggle
参数;你可以重新分配给toggle
。
【讨论】:
【参考方案6】:你可以替换
param = param && typeof param === 'boolean';
与
param = !!(param && typeof param === 'boolean');
这会将语句的结果转换为布尔否定,然后再次否定它。
【讨论】:
【参考方案7】:如果您认为null
(以及没有传递参数)、undefined
和 ""
(空字符串)为“没有参数传递给我的函数”使用这个语句:
toggle = toggle&&toggle||default_value
现在,如果您将 null
、undefined
或 ""
作为 toggle
arg 传递给您的函数,则此行将使用 default_value
填充它。
【讨论】:
【参考方案8】:看看jQuery extend 以及它们如何处理可选参数。
【讨论】:
【参考方案9】:ArgueJS 可以轻松完成:
this.selectItem = function()
arguments = __(item: undefined, toggle: [Boolean, false)
if (arguments.toggle)
// ...
您还可以通过将undefined
更改为所需的类型来检查item
的类型。
【讨论】:
以上是关于JavaScript中的可选参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章