我想根据参数是否未定义返回不同的语句。问题是,如果让我们说第二个参数丢失,第三个参数'变成'第二个参数,这样无论WHICH参数是否缺失,我只会触及最后一个if语句(只有当最后一个参数丢失时才应用) )。我已经研究但找不到解决方案。我试着用
var array=Array.prototype.slice.call(arguments);
然后检查数组[0],数组[1]和数组[2],但这也不起作用,因为我总是得到'c不存在' 任何帮助,将不胜感激。谢谢
function testing(a, b, c) {
if (a === undefined) {
return 'a doesnt exist'
} else if (b === undefined) {
return 'b doesnt exist'
} else if (c === undefined) {
return 'c doesnt exist'
}
}
testing(3, 'name')
答案 0 :(得分:4)
如果来电者仅使用两个参数调用您的函数,您不知道它是否是第二个或第三个参数,除非您可以从您期望的类型中推断它。例如,如果您希望b
为数字且c
为函数,则:
if (typeof b === "function") {
// `b` was omitted (effectively)
c = b;
b = undefined;
}
但是,如果您期望b
和c
使用相同类型的参数,或者您允许任何类型的参数,那么就没有办法你知道调用者只提供两个参数是否意味着提供a
和b
或a
和c
。
在这种情况下,您必须记录该功能,如果您希望(有效地)不使用b
,则需要为其提供undefined
:{{1 (这样做可以很好地与ES2015的默认参数一起使用,而完全不使用它。)
接受复杂的参数组合的另一种方法是接受一个对象而不是离散的参数:
testing(1, undefined, 3);

如果您这样做,并且您可以使用ES2015(又名" ES6")功能(例如,您只针对尖端浏览器,或者您正在进行转换) ,你可以使用参数解构让它们自动映射到你的参数:
function testing(options) {
console.log("a:", options.a);
console.log("b:", options.b);
console.log("c:", options.c);
}
// Usage
testing({a: 1, c: 3});

您甚至可以将其与默认参数值结合使用:
function testing({a, b, c}) {
console.log("a:", a);
console.log("b:", b);
console.log("c:", c);
}
// Usage
testing({a: 1, c: 3});

答案 1 :(得分:0)
或者只是确保使用所有三个参数调用函数,例如:
testing(3, undefined, 'name');