javascript初学者。
假设我有一个带有3个参数的javascript函数:
function f(arg1, arg2, arg3) { // do stuff }
我知道我可以调用f(value1,value2);在这种情况下,函数范围内的arg1将为value1,arg2将为value2,arg3将为null。
一切都好。但是,如果我想调用仅为arg1
和arg3
提供值的函数,我需要执行以下操作:f(value1, null, value2)
;
有没有一种方法可以指定哪些参数以更C#的方式具有哪些值(不指定给定的参数为null)?这样的事情:只为arg1
和arg3
调用带有值的f我会写f(value1, arg3 = value2);
有什么想法吗? 干杯!
答案 0 :(得分:8)
有一种我见过的方式:
例如
function person(name,surname,age)
{
...
}
person('Xavier',null,30);
你可以这样做:
function person(paramObj)
{
var name = paramObj.name;
var surname = paramObj.surname;
var age = paramObj.age;
}
这样打电话:
person({name:'Xavier',age:30});
我认为这是你能够做到的最接近的事情,就像在c#中一样,JS没有被编译,因此你无法预测函数的参数。
答案 1 :(得分:2)
使用JS可以做到这一点的唯一方法是传递一个包含所有参数的数组。
您必须在函数中设置默认值 - 您无法在JavaScript中为参数定义默认值。
function foo( args ){
var arg1 = args[ 0 ] || "default_value";
var arg2 = args[ 1 ] || 0;
///etc...
}
更好的是,您可以传递一个简单的对象而不是数组,这个对象允许您通过对象中的键访问参数:
function foo( params ){
var arg1 = params[ "arg1" ] || "default_value";
var arg2 = params[ "arg2" ] || 0;
///etc...
}
答案 2 :(得分:1)
如果你打算做(让我们说它有效)
f(value1, arg3 = value2)
然后参数2将是未定义的,所以只需传递:
f(value1, undefined, value2)
答案 3 :(得分:1)
借助 ECMAScript 6 (ECMAScript 2015)和引入的 Default Parameters ,它可以像设置默认值一样容易参数,并将undefined
传递给 skip 一个参数:
function paramsTest(p1 = "p1 def", p2 = "p2 def", p3 = "p3 def") {
console.log([p1, p2, p3]);
}
paramsTest(); // [ "p1 def", "p2 def", "p3 def"]
paramsTest("p#1", "p#2"); // [ "p#1", "p#2", "p3 def"]
paramsTest("p#1", undefined, null); // [ "p#1", "p2 def", null]
答案 4 :(得分:0)
将此代码添加到您的函数(默认值)
function f(a, b, c)
{
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
a = typeof c !== 'undefined' ? c : 43;
}
像这样调用函数
f(arg1 , undefined, arg3)
答案 5 :(得分:0)
是的,你可以。它可以写成:
function f(arg1, undefined, arg3) { // do stuff }
在此调用参数1& 3将通过,参数2将不会被发送。
答案 6 :(得分:0)
嘿,我有一个类似的问题,但我不知道它是否适用于任何上下文,并且对于ES5是否相同,但是在ES6和我的上下文中,我只能将undefined传递为我想要的参数跳过。
在上下文中,我的意思是在我的情况下,我为ES6格式的函数中的该参数分配一个默认值:
const exampleFunc = (arg1 = "defaultValue",arg2) => {
console.log(arg1,arg2)
}
exampleFunc(undefined,"hello!");
//this would log to the console "defaultValue","hello!"
我不确定如果您没有在ES6格式的函数中分配默认值,这是否行得通,但这对我有用!希望这对您有帮助
答案 7 :(得分:0)
另一种有趣的方法是使用Function.prototype.call()
方法。我们要做的就是为参数分配默认的调用对象值,然后您可以自由地仅使用要使用的参数来调用该方法:
function f(arg1 = this.arg1, arg2 = this.arg2 || false, arg3 = this.arg3) {
console.log([arg1, arg2, arg3]);
}
f.call({ arg1: 'value for arg1', arg3: 'value for arg3'});
f('value for arg1', undefined, 'value for arg3');
请注意,我将arg2设置为this.arg2 || false
-当不存在f.call实例对象arg2属性时,此语法允许回退为false而不是未定义。
答案 8 :(得分:0)
在ES6中,如果您的参数是可选的,因为它们具有默认值,并且您可以传递对象,则可以使用扩展语法:
function f(opts) {
const args = {
arg1: 'a',
arg2: 'b',
arg3: 'c',
...opts
}
const {arg1, arg2, arg3} = args
return arg1.concat(arg2, arg3)
}
f() // "abc"
f({arg1: '1', arg3: '3'}) // "1b3"
f({arg2: ' whatever '}) // "a whatever c"