2017-03-16 33 views
1

我想基于参数是否未定义来返回不同的语句。问题是,如果让我们说第二个参数缺失,那么第三个参数'变成'第二个参数,这样不管WHICH参数是否丢失,im只碰到最后一个if语句(只应用于最后一个参数丢失时)。我已经研究过,但找不到解决方案。我试图用Javascript - 如何检查特定'索引'中的函数参数是否缺失?

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') 

回答

4

如果主叫方只用两个参数调用你的功能,你不知道它是否是不可少的,除非你可以从你期望的类型推断出它的第二个或第三个参数。举例来说,如果你希望b是一个数字,c是一个函数,则:

if (typeof b === "function") { 
    // `b` was omitted (effectively) 
    c = b; 
    b = undefined; 
} 

但是,如果你期待同类型的参数为bc,或者你允许任何类型对于他们来说,那么你就无法知道提供两个参数的主叫方是否提供abac

在这种情况下,你必须记录功能的说,如果你想(有效)离开过b,你需要为它提供undefinedtesting(1, undefined, 3);(而且这样做与ES2015的默认参数很好地发挥, 。而离开它完全不)

另一种方法来接受的参数复杂的组合它接受一个对象,而不是离散的PARAMS:

function testing(options) { 
 
    console.log("a:", options.a); 
 
    console.log("b:", options.b); 
 
    console.log("c:", options.c); 
 
} 
 

 
// Usage 
 
testing({a: 1, c: 3});

如果你这样做了,并且如果你可以使用ES2015(又名“ES6”)功能(例如,你只针对尖端浏览器,或者你正在编译),你可以使用参数解构让他们自动映射到参数,为您提供:

function testing({a, b, c}) { 
 
    console.log("a:", a); 
 
    console.log("b:", b); 
 
    console.log("c:", c); 
 
} 
 

 
// Usage 
 
testing({a: 1, c: 3});

你甚至可以结合起来,与默认参数值:

function testing({a = 1, b = 2, c = 3}) { 
 
    console.log("a:", a); 
 
    console.log("b:", b); 
 
    console.log("c:", c); 
 
} 
 

 
// Usage 
 
testing({a: 1, c: 3});

0

或者只是确保你调用你的函数与所有三个参数,如:

testing(3, undefined, 'name'); 
相关问题