JavaScriptで変数が文字列なのかそれ以外なのかを判断するにはどうしたらいいですか?
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"
このWebページ]1の例です。(例は少し修正されていますが)。
new String()`で作成された文字列の場合は期待通りに動作しませんが、これはほとんど使用されず、[2]に対して推奨されています。必要であれば、これらをどのように扱うか、他の回答を参照してください。
1.Google JavaScript Style Guide primitive object wrappersを使ってはいけないとあります。 2.Douglas Crockford プリミティブ・オブジェクト・ラッパーを非推奨にすることを推奨。
最高の方法です。
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()」などのように、適切なクラス関数によって構築されています。
また、Duck-Typing。 "If it looks like a duck, walks like a duck, and smells like a duck - it must be an Array" (アヒルのように見えて、アヒルのように歩き、アヒルのような匂いがするなら、それは配列に違いない) 意味は、そのプロパティをチェックすることです。
ご参考になれば幸いです。
常に複数のアプローチを組み合わせて使うことができることを覚えておいてください。ここでは、アクションのインラインマップを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
この関数は [ カスタム ] の「タイプキャスティング」、つまり「タイプ/値のマッピング」を使って、変数が実際に「存在する」かどうかを調べます。これで、null
と 0
の間の厄介な髪を分けることができます!
多くの場合、変数の型を気にする必要はありません。型付けを回避するもう一つの方法は、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()メソッドがあります。数字の文字列換算値が同じであることを確認して、それを
Numberとして
http`関数に渡したことを確認しただけです。言い換えれば、その型が何であるかは*気にも留めませんでした。
これで作業の幅が広がるといいのですが :)