2011-01-28 7 views
8

変数が文字列かどうか(そして同様に番号、ブール値など)を調べる最も良い方法は何ですか?変数の型を確認する

通常あなたが見つける:

function isString(value) { 
    return typeof value === 'string'; 
} 
をしかし、人々は、1にも var foo = new String("bar");を使用して直接文字列オブジェクトを作成することができることを忘れて - それは良いアイデアであるか全く別の問題であるかどうか。

ここに行く方法は何ですか?私が考えることができます - と見てきました - 様々なアプローチ(やや簡略化):

// option 1 
function isString(value) { 
    return (typeof value === 'string') || 
      /^function String\(\)/.test(value.constructor + ''); 
} 

または

// option 2 
function isString(value) { 
    return (typeof value === 'string') || 
      (value.constructor === String); 
} 

または

// option 3 
function isString(value) { 
    return (typeof value === 'string') || 
      value instanceof String; 
} 

これについて移動するための "最良の" 方法はあります?または、それらはすべて同等ですか?

答えて

5

既存の3つのオプションのうち、最初のものは、正規表現を使用して文字列表現value.constructorをテストするため、私にはむしろ嫌な感じです。それは動作しますが、それはまだハッキー(おそらくそれは私です)を感じています。

第三のオプションがnew String()コンストラクタまたはString()から継承する他のオブジェクトで作られたオブジェクトを操作する必要があり、一方、第二のオプションは、文字列リテラル、new String()コンストラクタで作られた既存のオブジェクトおよびオブジェクトを連結から作成された文字列のために働くことになります(JavaScriptの継承についてはわかりませんが、誰かがこれを確認できますか?)

constructorプロパティは、newを使用して作成されたラッパーオブジェクトだけでなく、プリミティブ/リテラル​​に対しても存在します。

function isString(value) { 
    return value.constructor === String; 
} 

alert(isString("test1"));    // true 
alert(isString(new String("test2"))); // true 

しかし、第三の選択肢とは異なり、それはString()から継承String()以外のコンストラクタを持つオブジェクトでは動作しないことがあります。これは、第二の選択肢はかなり冗長でtypeofチェックを行います。

私の答えは質問を反映するために、例として、文字列を使用していますが、同じ考え方はNumberBooleanFunctionObjectArrayおよび他のタイプに適用されます。

+0

ニート、私はそれを知らなかった(少なくとも私はそれを考えなかった;)本当に質問に答えない。 – n3rd

+0

@ n3rd:既存の3つのオプションの1つではないが、それ以外の質問にはどのように答えられないのですか? – BoltClock

+0

+1。ちょうどこれを掲載しようとしていた。これはStringのサブクラスをキャッチしますか? – Skurmedel

関連する問題