2012-01-26 11 views
1

我有一个功能,就是这个样子 -检查的多个参数中存在一个优雅的方式

var myFunction = function(arg1, arg2, arg3, arg4, arg5, arg6, arg7){ 
    if(typeof arg1 != 'undefined' && typeof arg2 attributeId != 'undefined' && typeof arg3 != 'undefined'){ //and so on for all the arguments 
    //do something with all of the arguments 
    } 
} 

基本上,我检查,如果做某件事之前存在的论据所有7。

这看起来很丑并且不可读。你能提出一个更优雅的方式来实现同样的事情吗?

回答

1

它可以使用arguments变量来确定有多少参数传递

if (arguments.length !== 7) { 
    ... 
} 

但是,这仍然不会告诉你,它们都是定义的值。为了确定它们是否都被定义必须逐个检查它们,因为它是合法的参数列表

myFunction(1, 2, undefined, 4, 5, 6, 7); 

也许是最好的办法中间通行undefined是抽象了这一点,以一个单独的函数

var allDefined = function(args) { 
    var i = 0; 
    for (i = 0; i < args.length; i++) { 
    if (typeof args[i] === 'undefined') { 
     return false; 
    } 
    } 
    return true; 
} 

var myFunction = function(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { 
    if (arguments.length === 7 && allDefined(arguments)) { 
    // They're all there 
    } 
} 
0

您可以使用arguments.length来获取实际传递的参数数量。

arguments是一个“阵列式”内建。如果你想测试参数是否有值,就像对任何数组进行循环一样。 (当然,你可能会认为从框架“查询”的方法更优雅,但最终,某人的循环。)

+0

@JaredPar,你评论的速度比我编辑的要快。 – harpo

0

每个函数可以访问arguments伪阵列,它包含了所有的被传递的参数。

如果你想确保你有7个论点,都是非null,则检查将看是这样的:

if (arguments.length != 7 || ![].slice.call(arguments, 0, 7).every(
     function(val) { return val != null; })) { 

     alert("Please pass 7 good arguments"); 
     return; 
} 

DEMO

(支持你要抓住一个垫片为every方法,由于某种原因,我没有看到MDN旧的浏览器)

0
var myFunction= function(){ 
    var i= 7, a= arguments; 
    while(i){ 
     if(a[--i]== undefined) return new Error('Expected 7 arguments') 
    } 
    return a.length; 
    //the first 7 arguments are not null or undefined 
    // they could be false, '', 0 or NaN 
} 
myFunction(1, 2, 3, 4, 5, '', 7) 
/* returned value: (Number) 
7 
*/ 
myFunction(1, 2, 3, 4, 5, null, 7) 

/* returned value: (Error) 
Error: Expected 7 arguments 
*/ 
相关问题