ネットでみかけた使える?テクニック toString 編
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
シリーズ物風にタイトルつけましたが続くか変わらないです
toString.call()
型を調べるテクニックですtoString.call(12)
"[object Number]"
toString.call("abc")
"[object String]"
toString.call(true)
"[object Boolean]"
toString.call(null)
"[object Window]"
toString.call(undefined)
"[object Window]"
toString.call({})
"[object Object]"
toString.call([])
"[object Array]"
toString.call(Symbol())
"[object Symbol]"
toString.call(function(){})
"[object Function]"
toString.call(new Date())
"[object Date]"
toString.call(new RegExp())
"[object RegExp]"
toString.call(new function abc(){})
"[object Object]"
function A(){}
toString.call(new A())
"[object Object]"
toString.call(new Map())
"[object Map]"
toString.call(new Object())
"[object Object]"
toString.call(document)
"[object HTMLDocument]"
toString.call(new Uint8Array())
"[object Uint8Array]"
toString.call(window)
"[object Window]"
"[object Number]"
toString.call("abc")
"[object String]"
toString.call(true)
"[object Boolean]"
toString.call(null)
"[object Window]"
toString.call(undefined)
"[object Window]"
toString.call({})
"[object Object]"
toString.call([])
"[object Array]"
toString.call(Symbol())
"[object Symbol]"
toString.call(function(){})
"[object Function]"
toString.call(new Date())
"[object Date]"
toString.call(new RegExp())
"[object RegExp]"
toString.call(new function abc(){})
"[object Object]"
function A(){}
toString.call(new A())
"[object Object]"
toString.call(new Map())
"[object Map]"
toString.call(new Object())
"[object Object]"
toString.call(document)
"[object HTMLDocument]"
toString.call(new Uint8Array())
"[object Uint8Array]"
toString.call(window)
"[object Window]"
null や undefined はグローバルオブジェクトの Window になります
Date や RegExp や Map などの組み込み型(関数)はちゃんと名前が出ます
自分で定義した関数だと Object になってしまいます
また プロトタイプ(コンストラクタ)を書き換えても
var a = []
a.__proto__ = Object.prototype
a.map
// undefined
a.constructor
// Object() { [native code] }
toString.call(a)
// "[object Array]"
var d = new Date()
d.__proto__ = Object.prototype
toString.call(a)
// "[object Date]"
このとおり ちゃんと判定されますa.__proto__ = Object.prototype
a.map
// undefined
a.constructor
// Object() { [native code] }
toString.call(a)
// "[object Array]"
var d = new Date()
d.__proto__ = Object.prototype
toString.call(a)
// "[object Date]"
これは覚えておくと役立ちそう って思うのですが 実際どこで使うのって考えると必要なところが出てこないです
たいてい typeof で十分ですし 普通に使ってると 組み込みの関数のプロトタイプチェーンをいじるとかしないので instanceof が使えますし
最初に見たときは文字列化したいとき null か undefined が来てもいいようにしてるのかな と思ったのですが実行してみると全然 toString してなくて そういう使い方なのか! って思いました