JavaScriptでvarが文字列かどうかを確認するにはどうすればよいですか?


回答:


381

あなたは近かった:

if (typeof a_string === 'string') {
    // this is a string
}

関連する注記:上記のチェックは、文字列が作成された場合、代わりにnew String('hello')タイプが作成されると機能しませんObject。これを回避するための複雑な解決策がありますが、これまでと同じように文字列を作成しないことをお勧めします。


1
みんな、私は本当にあなたの両方に受け入れられた答えを与えますが、私ができないのは、私にできないのは、私の特定の問題により近い人に受け入れられた答えを与えることです。完全に説明しました。
vitto

これは私のために働きましたif(typeof(str) === typeof(String()))
スコット・マーフィー

78

typeofオペレータは、(あなたの例のLHSは意味がありませんので)中置ではありません。

あなたはそのようにそれを使う必要があります...

if (typeof a_string == 'string') {
    // This is a string.
}

覚えておいてください、typeof演算子、関数ではなく。これにもかかわらず、あなたはtypeof(var)野生でよく使われているのを見るでしょう。これはと同じくらい意味がありvar a = 4 + (1)ます。

また、==両方のオペランドがStrings(typeof 常に a 返す)であるため(等価比較演算子)を使用することもできます。JavaScriptはString、私が使用したのと同じ手順を実行するように定義されています===(厳密比較演算子)。

以下のようBox9は言及し、これは検出されませんインスタンス化Stringオブジェクトを。

あなたはそれでそれを検出することができます...

var isString = str instanceof String;

jsFiddle

...または...

var isString = str.constructor == String;

jsFiddle

しかし、これはマルチwindow環境では機能しません(iframes と考えてください)。

あなたはこれで回避することができます...

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle

ただし、繰り返しになりますが(Box9で言及されているように)、リテラルString形式(たとえば)を使用するほうがよいでしょうvar str = 'I am a string';

さらに読む


1
@ Box9心配する必要はありません。とにかく担当者に連絡します:P
アレックス

@alex私も今:o(あと10分!)
David Tang

3
キャップされた@RobG担当者は、24時間で最大担当者を獲得したときです。その後、賛成票はあなたの評判にカウントされません。
アレックス

文字列だけが持つメンバーの存在をテストするだけでは、変数が文字列かどうかを確認することはできませんか?例:if(myVar.toUpperCase) alert('I am a string');?参照:jsfiddle.net/tb3t4nsx
原材料

1
@ ingredient_15939それは本当に良い方法ではありません...なぜなら{ toUpperCase: '' }
アレックス

14

前の回答を組み合わせると、次のソリューションが提供されます。

if (typeof str == 'string' || str instanceof String)

または

Object.prototype.toString.call(str) == '[object String]'

4

次の式はtrueを返します

'qwe'.constructor === String

次の式はtrueを返します

typeof 'qwe' === 'string'

次の式はfalse(sic!)を返します。

typeof new String('qwe') === 'string'

次の式はtrueを返します

typeof new String('qwe').valueOf() === 'string'

最善かつ正しい方法(imho):

if (someVariable.constructor === String) {
   ...
}

1

今日では、typeof()の関数形式を使用する方が好ましいと思うので...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

の関数形式はtypeofありません。括弧で操作の順序を制御するだけです。一部の人々は、特定の状況でそれを読みやすくするかもしれません。
Jon z

@Jonz「操作の順序を制御する」とはどういう意味ですか?ありがとう。
a20 18/04/18

後で私はあなたがコンストラクターをチェックしてそれを好むことができることに気付いたと思います。例の番号4は、括弧の使用法developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…を示しています。これは、コンパイラの構文解析で検討する方が間違いなく読みやすく、少なくなります。「順序」に関する私の推測は、おそらく速度の問題か、コンパイラが引数スタックをロードする方法に関連していると思いますが、よくわかりません。
マスタージェームズ

1
@ a20操作の順序は、複数の操作を含むステートメントに対して操作が実行される順序を示します。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…を参照してください。-括弧(オペレーティンググループ)は、演算子の優先順位が最も高いため、最初に評価されます。この場合、括弧filenameは単一のステートメントのみをグループ化するため、役に立たず無関係です。この回答のスコアが0であるのは、間違いであり、誤解を招き、役に立たないため、良いことです。負のスコアがあった方がいいでしょう。
Jon z

リンクに非常に有益な感謝を。括弧がチェックされて最初に実行されますか?そのため、かっこなしで別名を呼び出す他の方法を次にチェックせずにすぐに実行する必要があります。番号?そこにあるランタイムコンパイラについて私は何を理解していないのですか?
マスタージェームズ

0

すべてのケースでnullまたはundefinedをチェックします

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}

typeof nullそして、typeof undefined返すことはありません'string'ので、typeof a_string十分です。ネクロポスティングで申し訳ありません
Ivan Frolov

-3

私の個人的なアプローチは、すべてのケースで機能するように見えますが、すべて文字列に対してのみ存在するメンバーの存在をテストすることです。

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

参照:http : //jsfiddle.net/x75uy0o6/

この方法に欠陥があるかどうか知りたいのですが、何年にもわたって役立ってきました。


2
これは、それらのメソッドを持つ古いオブジェクトによって簡単に騙されます。
アレックス、2015

8
これはダックタイピングと呼ばれます。たとえば、それが文字列のように歩き、文字列のように話す場合、それは文字列である可能性もあります。これが文字列をテストするための最良の方法であると考えるなら、少し頭がおかしいですが、JavascriptはThunderdomeです。
Jon z
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.