確認 - typedef javascript




JavaScriptで変数が文字列かどうかを確認する (12)

変数が文字列かどうかをJavaScriptで判断するにはどうすればよいですか?


580人以上の人が間違った答えに投票し、800人以上が働いているがショットガンスタイルの答えに投票しているので、誰もが理解できる単純な形で自分の答えをやり直す価値があると思った。

function isString(x) {
  return Object.prototype.toString.call(x) === "[object String]"
}

または、インライン(これはUltiSnipの設定があります):

Object.prototype.toString.call(myVar) === "[object String]"

パープロ・サンタクルーズの答えは間違っています。なぜなら、 typeof new String("string")object

DRAXの答えは正確で機能的であり、正解でなければなりません(Pablo Santa Cruzは間違いがありますので、一般投票に反対しません)。

しかし、この答えは間違いなく正確であり、実際には最良の答えです(おそらく、 lodash / underscoreを使用することを示唆するものをlodash )。 免責事項:私はlodash 4コードベースに貢献しました。

私の元の答え(明らかに多くの頭の上を飛んだ)は次のとおりです:

私はアンダースコアからこれをコード変換しました.js:

['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'].forEach( 
    function(name) { 
        window['is' + name] = function(obj) {
              return toString.call(obj) == '[object ' + name + ']';
    }; 
});

それはisString、isNumberなどを定義します。

Node.jsでは、これをモジュールとして実装できます:

module.exports = [
  'Arguments', 
  'Function', 
  'String', 
  'Number', 
  'Date', 
  'RegExp'
].reduce( (obj, name) => {
  obj[ 'is' + name ] = x => toString.call(x) == '[object ' + name + ']';
  return obj;
}, {});

@ DRAXのanswerを広げるために、私はこれをします:

function isWhitespaceEmptyString(str)
{
    //RETURN:
    //      = 'true' if 'str' is empty string, null, undefined, or consists of white-spaces only
    return str ? !(/\S/.test(str)) : (str === "" || str === null || str === undefined);
}

nullundefined型についても説明し、 0などの非文字列型を処理し0


typeof演算子を使用することができます:

var booleanValue = true; 
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"

このウェブページの例 (例は若干修正されたが)。

これは、 new String()で作成された文字列の場合は期待どおりに動作しませんが、これは[1] [2]に対して使用されることはめったにありません。 あなたが望むなら、これをどう扱うべきかについての他の答えを見てください。

  1. Google JavaScriptスタイルガイドには、プリミティブオブジェクトラッパーを使用しないと言われています
  2. Douglas Crockford は、プリミティブオブジェクトラッパーは非推奨とすることを推奨しました

jQuerylodash / Underscoreの組み込み関数を使うことをお勧めします。 彼らは使いやすく、読みやすい。

いずれの関数も、言及されたケースDRAXを処理します...つまり、(A)変数が文字列リテラルか(B)それがStringオブジェクトのインスタンスかどうかをチェックします。 どちらの場合でも、これらの関数は値を文字列として正しく識別します。

lodash / Underscore.js

if(_.isString(myVar))
   //it's a string
else
   //it's something else

jQuery

if($.type(myVar) === "string")
   //it's a string
else
   //it's something else

詳細については、 _ . isString()のlodashドキュメンテーションを参照してください。

詳細については、$ .type()のjQueryドキュメンテーションを参照してください。


これは私のために働くものです:

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else

これは私のために十分です。

警告:これは完璧な解決策ではありません。 私のポストの下を見てください。

Object.prototype.isString = function() { return false; };
String.prototype.isString = function() { return true; };

var isString = function(a) {
  return (a !== null) && (a !== undefined) && a.isString();
};

そして、あなたはこれを以下のように使うことができます。

//return false
isString(null);
isString(void 0);
isString(-123);
isString(0);
isString(true);
isString(false);
isString([]);
isString({});
isString(function() {});
isString(0/0);

//return true
isString("");
isString(new String("ABC"));

警告:これは、ケースで正しく動作しません。

//this is not a string
var obj = {
    //but returns true lol
    isString: function(){ return true; }
}

isString(obj) //should be false, but true

ロダッシュから撮影:

function isString(val) {
   return typeof val === 'string' || ((!!val && typeof val === 'object') && Object.prototype.toString.call(val) === '[object String]');
}

console.log(isString('hello world!')); // true
console.log(isString(new String('hello world'))); // true

最良の方法:

var s = 'String';
var a = [1,2,3];
var o = {key: 'val'};

(s.constructor === String) && console.log('its a string');
(a.constructor === Array) && console.log('its an array');
(o.constructor === Object) && console.log('its an object');
(o.constructor === Number || s.constructor === Boolean) && console.log('this won\'t run');

これらはそれぞれ、 "new Object()"などの適切なクラス関数によって構築されています。

また、ダックタイピング:「アヒルのように見え、アヒルのように歩き、アヒルのようなにおいがするならば、それは配列でなければならない」意味、その特性をチェックする。

お役に立てれば。

編集する。 12/05/2016

覚えておいても、常にアプローチの組み合わせを使用することができます。 typeofでアクションのインラインマップを使用する例を次に示します

var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ];

インラインマップを使用するより現実的な例を次に示します。

function is(datum) {
    var isnt = !{ null: true, undefined: true, '': true, false: false, 0: false }[ datum ];
    return !isnt;
}
console.log( is(0), is(false), is(undefined), ... );  // >> true true false

この関数は、変数が実際に "存在する"かどうかを判断するために、[カスタム] "型変換" - むしろ "型 - / - 値マッピング"を使用します。 今あなたはnull0間でその厄介な髪を分割することができます!

あなたはそのタイプについて何度も気にしません 。 タイピングを回避する別の方法は、Duck-Typeセットを組み合わせることです。

this.id = "998";  // use a number or a string-equivalent
function get(id) {
    if (!id || !id.toString) return;
    if (id.toString() === this.id.toString()) http( id || +this.id );
    // if (+id === +this.id) ...;
}

Number.prototype String.prototype両方に.toString() methodます。 数字の文字列相当が同じであることを確認した後、 http関数にNumberとして渡したことを確認しました。 言い換えれば、そのタイプが何であってもにしませんでした。

希望はあなたにもっと働くことができます:)


私はこの単純なソリューションを使いたい:

var myString = "test";
if(myString.constructor === String)
{
     //It's a string
}

私はこれもうまく動作し、他の例よりもはるかに短いことも発見しました。

if (myVar === myVar + '') {
   //its string
} else {
   //its something else
}

空の引用符を連結すると、値が文字列に変換されます。 myVarがすでにストリングの場合、ifステートメントは成功です。



var a = new String('')
var b = ''
var c = []

function isString(x) {
  return x !== null && x !== undefined && x.constructor === String
}

console.log(isString(a))
console.log(isString(b))
console.log(isString(c))






javascript