说我有这个
function isdef(x) { return typeof x !== 'undefined'; }
function banana(a, b, c) {
if (!isdef(a)) a = 1;
if (!isdef(b)) b = 2;
if (!isdef(c)) c = 3;
...
}
所以所有参数都是可选的。如果我想用c参数调用它,我必须写
banana(undefined, undefined, 5);
这有点笨重。
当然,我可以做类似
的事情window.k = undefined;
...
banana(k, k, 5);
但我真的不想制作短窗口范围变量。
例如在vb.net中,我可以写
banana(,,5)
但是js并不喜欢这样。
有没有一种方便的方法可以跳过函数调用中的参数?
答案 0 :(得分:2)
你可以传递一个对象
function banana(options) {
if (!isdef(options.a)) a = 1;
if (!isdef(options.b)) b = 1;
}
banana({a:1});
答案 1 :(得分:1)
我认为在JavaScript中没有办法只能在不传递第一个参数的情况下提供后面的参数。而且我不确定你的要求。但这是我的方法。请随时回复。
function banana(bananaObj){
bananaObj = bananaObj || {};
bananaObj.a = bananaObj.a || 1;
bananaObj.b = bananaObj.b || 2;
bananaObj.c = bananaObj.c || 3;
document.write('bananaObj: ', JSON.stringify(bananaObj));
}
banana({c:10})
答案 2 :(得分:1)
是否有方便的方法在函数调用中跳过参数?
不直接。
ES Discuss mailing group讨论了这个主题。至少可以说,对该提案的接受是冷淡的。还建议在函数定义中使参数可选:
function foo(a, , b) { }
您的选择包括:
使用spread syntax如下:
banana(...[,,5])
重新排序参数以将可选参数放在最后。
编写一个higher-level function转换函数以添加其他主要参数:
function prefixArgs(fn, n) {
return function(...args) {
return fn(...Array(n), ...args);
};
}
prefixArgs(banana, 2)(5)
使用对象而不是参数列表,如其他答案所示。
“Curry”函数,如
function banana(a = 1) {
return function(b = 2) {
return function(c = 3) {
return SOMETHING-USING-A-B-AND-C;
};
};
}
banana()()(5)
请注意,在上面我使用了parameter defaults。它们是您为undefined编写的检查的一个很好的替代方法:
function banana(a = 1, b = 2, c = 3) {
...
}
虽然这本身并不能解决如何传入引导可选参数的问题。您可以将此banana
的实现与上述一些想法结合使用。
<强>支持即可。请注意,扩展参数和参数默认值是ES6功能。如果你不熟悉它们,你应该开始学习它们。如果您需要针对IE本身不支持它们的浏览器,那么您需要使用Babel等知名工具进行转换。
答案 3 :(得分:0)
您可以先声明必需的参数,然后以这种方式后跟可选参数:
function banana(a, b, c) {
b = b || 0;
c = c || 0;
// a is required, b and c is optional, either b or 0
}
调用省略banana(1)
和b
的函数c
,或提供所有参数banana(1, 2, 3)
。
另一种方法是声明对象的参数,这样就不需要记住参数的顺序或数量了。
function banana(args) {
// set defaults
args.a = args.a || 0;
args.b = args.b || 0;
args.c = args.c || 0;
}
调用函数banana({ a: 1, b: 2 })
。
答案 4 :(得分:0)
您可以使用 public static class Seanger extends Musiker { ...
,rest parameter
,括号表示法。如果要返回所有变量,则传递索引以选择Array.prototype.map()
或banana
作为第一个参数
null
&#13;