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