1. typeof
其中數(shù)組、對(duì)象、null都會(huì)被判斷為object,其他判斷都正確。
2. instanceof
instanceof可以正確判斷對(duì)象的類型,其內(nèi)部運(yùn)行機(jī)制是判斷在其原型鏈中能否找到該類型的原型。
可以看到,instanceof只能正確判斷引用數(shù)據(jù)類型,而不能判斷基本數(shù)據(jù)類型。instanceof 運(yùn)算符可以用來測試一個(gè)對(duì)象在其原型鏈中是否存在一個(gè)構(gòu)造函數(shù)的 prototype 屬性。
3. constructor
constructor有兩個(gè)作用,一是判斷數(shù)據(jù)的類型,二是對(duì)象實(shí)例通過 constrcutor 對(duì)象訪問它的構(gòu)造函數(shù)。
需要注意,如果創(chuàng)建一個(gè)對(duì)象來改變它的原型,constructor就不能用來判斷數(shù)據(jù)類型了:
4. Object.prototype.toString.call()
Object.prototype.toString.call() 使用 Object 對(duì)象的原型方法 toString 來判斷數(shù)據(jù)類型:
同樣是檢測對(duì)象obj調(diào)用toString方法,obj.toString()的結(jié)果和Object.prototype.toString.call(obj)的結(jié)果不一樣,這是為什么?
這是因?yàn)閠oString是Object的原型方法,而Array、function等類型作為Object的實(shí)例,都重寫了toString方法。
不同的對(duì)象類型調(diào)用toString方法時(shí),根據(jù)原型鏈的知識(shí),調(diào)用的是對(duì)應(yīng)的重寫之后的toString方法(function類型返回內(nèi)容為函數(shù)體的字符串,Array類型返回元素組成的字符串…),而不會(huì)去調(diào)用Object上原型toString方法(返回對(duì)象的具體類型),所以采用obj.toString()不能得到其對(duì)象類型,只能將obj轉(zhuǎn)換為字符串類型;因此,在想要得到對(duì)象的具體類型時(shí),應(yīng)該調(diào)用Object原型上的toString方法。