6

この質問は[]のスピンオフですが、配列のインスタンスですが、「」は文字列ではありません

とすれば

"" instanceof String; /* false */
String() instanceof String; /* false */
new String() instanceof String; /* true */

typeof "" === "string"; /* true */
typeof String() === "string"; /* true */
typeof new String() === "string"; /* false */

次に、変数がabcあり、それが文字列かどうかを知りたい場合は、次のことができます。

if(typeof abc === "string" || abc instanceof String){
    // do something
}

これを行うためのより簡単で短くネイティブな方法はありますか、それとも独自の関数を作成する必要がありますか?

function isStr(s){
    return typeof s === "string" || s instanceof String;
}
if(isStr(abc)){
    // do something
}
4

3 に答える 3

7

Object.prototype.toString.call(a) === "[object String]"はこれを行うための最短/ネイティブの方法だと思います

于 2012-09-03T23:08:10.107 に答える
1

あなたは正しいです:

typeof myVar == 'string' || myVar instanceof String;

変数が文字列であるかどうかを確認するための最良の方法の1つです。

于 2012-09-03T23:25:18.720 に答える
1

は配列オブジェクト[]の作成として定義されている配列初期化子(配列リテラルと呼ばれることが多い)であるのに対し、は文字列プリミティブの作成として定義されている文字列リテラルであるため、混乱する可能性があります。''

プリミティブは、便宜上、関連するオブジェクトに強制変換される場合がありますが、どのような種類のオブジェクトのインスタンスでもありません。

より重要な質問は、isString関数が文字列プリミティブと文字列オブジェクトの両方に対してtrueを返す必要がある理由です。文字列オブジェクトの使用は(非常に?)まれです。それらの使用は特別な扱いを推測し、2つを区別して同じように扱わないようにしたいと思います。

変数のタイプを無視するのがはるかに一般的であり、タイプが変化する可能性がある場合は、無条件に必要なタイプに変換します。たとえば、文字列プリミティブが必要な場合は次のようになります。

function foo(s) {
  s = String(s); // s is guaranteed to be a string primitive
  ...
}

例外は、関数がオーバーロードされ、特定の引数が関数、オブジェクトなどであるかどうかによって動作が異なる場合です。このようなオーバーロードは一般的に良い考えとは見なされませんが、多くのjavascriptライブラリはそれに依存しています。このような場合、文字列プリミティブではなくStringオブジェクトを渡すと、予期しない結果が生じる可能性があります。

于 2012-09-04T02:09:44.253 に答える