何がツラいって一番ありがちな下記のような場合ですよね。
var a = {}, b = [], c = 'hoge', d = new String('hoge');
typeof a; // "object"
typeof b; // "object" ← ファッ?!
typeof c; // "string"
typeof d; // "object" ← ファッ?!
Object と Array を区別してくれないとかないわー。new String()
使うことないけど、区別しちゃうとかないわー。
ということで以前に自分が日本語訳したJavaScript Gardenにも書いてあった方法を使うと
判別が楽になるんじゃないかと。
function is(type, obj) {
var clas = Object.prototype.toString.call(obj).slice(8, -1);
return obj !== undefined && obj !== null && clas === type;
}
is('String', 'hoge'); // true
is('String', new String('hoge')); // true
Object.prototype.toString
することによって[[Class]]
という内部プロパティを取得して必要なものを切り出してっていう話です。
これで下記のようなタイプを取得してこれますので比較対象として引数に渡してあげましょうという感じです。
- String
- Number
- Boolean
- Date
- Error
- Array
- Function
- RegExp
- Object
これで大体感覚通りの型判別ができると思います。
余談ですが、上記のサイトの中で唯一typeof
が使える場面としてた下記のような未定義変数の判別だけ!と書いてあります。
typeof hoge !== 'undefined'; // 未定義だとfalseに
ですよね…。
参照: http://bonsaiden.github.io/JavaScript-Garden/ja/#types.typeof