#typeof 使ってますか?
typeof って世間一般的に (恐らく) あまり使ってないんじゃないかと思います。
使ってない理由としては私的には以下のような理由です。
- typeof null が "object" になる。
- typeof [] や {} が "object" になる。
- typeof new Number(0) とかも "object" になっちゃう。
まったく、直観的にイメージする判定ができないので使っていません。(…たまに使うかな)
ただ、かなり前ですが小飼弾さんという方が typeof を再定義されていたのでこれを一瞬だけ使ってみたこともあります。
javascript - typeof()を再発明する
javascript - 関数名の取得とtypeof()の再々発明
(そうとう古い記事なので参考にする場合には時代背景に考慮を)
今なら Array だけは Array.isArray() でいいですけどね。昔は大変でした。
#私なりの型判定方法
今は以下のようにしています。共通で読み込む js の先頭に定義します。
結構古いブラウザでも対応していてIE9でも大丈夫です。
Object.defineProperty(Array .prototype, 'isArray' , { value:true, writable:false, enumerable:false, configurable:false });
Object.defineProperty(String .prototype, 'isString' , { value:true, writable:false, enumerable:false, configurable:false });
Object.defineProperty(Number .prototype, 'isNumber' , { value:true, writable:false, enumerable:false, configurable:false });
Object.defineProperty(Function.prototype, 'isFunction', { value:true, writable:false, enumerable:false, configurable:false });
Object.defineProperty(Boolean .prototype, 'isBoolean' , { value:true, writable:false, enumerable:false, configurable:false });
Object.defineProperty(RegExp .prototype, 'isRegExp' , { value:true, writable:false, enumerable:false, configurable:false });
これで色々型の判定をしています。
if( ary.isArray ){ ・・・ }
[].isArray
(()=>{}).isFunction
/ /.isRegExp
(99).isNumber
'aiueo'.isString
このような感じです。
Object.defineProperty() を使用すれば for(x in ary)
や Object.keys()
などでも列挙されないように定義できるので便利になりました。
.prototype
を汚すのは良くないかなとは思うのですが、あると色々楽になるのでこれだけ例外として使用しています。
型判定って良く行うと思うのですが、上記のようなやり方を他で見たことがなかったのでご紹介でした。
もし、この方法では良くない、とか、他にもっと分かりやすいやり方があるよ、とか、二番煎じだよとかあれば教えて頂けるとありがたいです。