2016-08-12 5 views
-2

変数が存在し、その長さが単一のifステートメント内の特定の数値よりも大きいかどうかをチェックしたいと思います。私が行って、所望の結果を達成することができます変数が同じであるかどうかを確認する方法&& .length> x()?

if(v){ 
    if(v.length>3) 
     //do thing 
} 

をしかし、私はちょうど行うにしようとします。vが宣言されていない

if(v.length>3) 
    // do thing 

Iのバグ出しを。同様に私がしようとする場合:

if(v&&v.length>3) 

私はバグアウト。どのようにして目的の結果を最も容易に達成するには?

+2

'if(v && v.length && v.length> 3)' ...最後のコードスニペットでどのような状況で「バグアウト」しますか? –

+0

@ JaromandaXあなたは間違っています:https://paste.fedoraproject.org/406544/47097316/ –

+2

私は答えとしてそれを入れていませんでした...しかし、質問の最初のコードスニペットはうまくいかないでしょう、だから、私は質問に敬意を払って間違っていることはできません –

答えて

3

最終的な回答は、ソリューションの一般的な使用方法によって異なります。 .lengthは "length"という名前のオブジェクトプロパティを検索するための略記法ですが、オブジェクト値に適用する必要があります。しかし、typeof演算子は、関数オブジェクトに対しては "function"を返し、オブジェクトデータ型ではなく、プロパティを検索しようとするとクラッシュする "null"の "object"を返します。ああ、プリミティブな文字列値は、lengthプロパティを持つStringオブジェクトに昇格します。

ので、一般的な解決策はvのためのテストがnullの値を有するtruthy除外v

if(v && typeof v == "object" || typeof v == "function" || typeof v == "string" && v.length > 3) 
{ // do stuff 
} 

ようになります。あなたは(彼らが期待する引数の数を与えるlength性質を持っている)関数オブジェクトと文字列値を除外することができます場合は、lengthプロパティが存在しない場合という

if(v && typeof v == "object" && v.length > 3) 

に注意し、これを短縮することができることをしかし予告値がundefinedundefined > 3がfalseを返します。質問のコメントの後


更新: vが定義されていない場合

if(v) 

は、strictモードで失敗する可能性があります。これは、ifステートメントの後に実行されるletまたはconstステートメントを使用してvを定義した結果です。最初にletまたはconst文を実行するか、vをテストコードの範囲内のvar文を使用して宣言します。

関連する問題