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