最終的な回答は、ソリューションの一般的な使用方法によって異なります。 .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)
に注意し、これを短縮することができることをしかし予告値がundefined
、undefined > 3
がfalseを返します。質問のコメントの後
更新:
v
が定義されていない場合
if(v)
は、strictモードで失敗する可能性があります。これは、if
ステートメントの後に実行されるlet
またはconst
ステートメントを使用してv
を定義した結果です。最初にletまたはconst文を実行するか、v
をテストコードの範囲内のvar
文を使用して宣言します。
'if(v && v.length && v.length> 3)' ...最後のコードスニペットでどのような状況で「バグアウト」しますか? –
@ JaromandaXあなたは間違っています:https://paste.fedoraproject.org/406544/47097316/ –
私は答えとしてそれを入れていませんでした...しかし、質問の最初のコードスニペットはうまくいかないでしょう、だから、私は質問に敬意を払って間違っていることはできません –