2012-01-26 14 views
1

で複数の引数が存在することを確認する - すべての引数7が何かを行う前に、存在する場合は、私はこのような関数を持ってエレガントなやり方

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 
    } 
} 

基本的に、私はチェックしています。

これは醜く見え、判読できません。あなたは同じことを達成するためのよりエレガントな方法を提案できますか?

答えて

1

それは渡された引数の数を決定するためにarguments変数を使用することが可能です

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

しかし、これはまだそれらのすべてが定義された値であるとは言いません。彼らはすべてのそれは引数リスト

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

おそらく最善のアプローチの途中で未定義渡すために法的だとして、あなたがそれらを個別に確認する必要があります定義されているかどうかを判断するために、別の関数には、このうち抽象的にある

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擬似配列へのアクセスを持っている。

あなたが非nullである7引数を持っていることを確認したい場合は、チェックが見えますこのような何か:

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

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

DEMO

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 
*/ 
(あなたには、いくつかの理由で、私はMDNに見ていないよ every方法、のためのシムをつかむしたいと思う古いブラウザをサポートするため)
関連する問題