シリーズ物風にタイトルつけましたが続くか変わらないです

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]"

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]"
このとおり ちゃんと判定されます


これは覚えておくと役立ちそう って思うのですが 実際どこで使うのって考えると必要なところが出てこないです
たいてい typeof で十分ですし 普通に使ってると 組み込みの関数のプロトタイプチェーンをいじるとかしないので instanceof が使えますし


最初に見たときは文字列化したいとき null か undefined が来てもいいようにしてるのかな と思ったのですが実行してみると全然 toString してなくて そういう使い方なのか! って思いました