能檢測的方法不少 基本上的疑惑點是如何檢測object null array function,能準確的檢測出來這幾個的都是好方法數組
typeof 0; //number; typeof true; //boolean; typeof undefined; //undefined; typeof "hello world" //string; typeof function(){}; //function; typeof null; //object typeof {}; //object; typeof []; //object
1. typeof 爲何不許spa
由於當他在檢測null array object的時候 都是object,這是由於這幾個都是Object重寫的實例 這個也會幫助咱們理解標題的疑惑prototype
2.Object.prototype.toString.call(obj) 爲何有用code
toString方法返回反映這個對象的字符串對象
爲何它就能準確判斷類型呢,爲何用Object.tostring 方法就不行呢blog
仍是那一句話 null array object都是Object重寫的實例 他們是有本身的tostring的方法 按照原型鏈的思路,會優先使用重寫後的tostring方法,而咱們只想用原型鏈上的tostring的方法原型鏈
驗證字符串
var arr=[1,2,3]; console.log(Array.prototype.hasOwnProperty("toString"));//true console.log(arr.toString());//1,2,3 delete Array.prototype.toString;//delete操做符能夠刪除實例屬性 console.log(Array.prototype.hasOwnProperty("toString"));//false console.log(arr.toString());//"[object Array]"
當咱們刪除了array本身的tostring方法後 再次訪問會調用原型鏈後的方法 跟Object.prototype.tostring(obj)同樣了原型
擴展:其餘能檢測類型的方法string
1. instanceof
能夠檢測是不是該原型的實例
// 判斷 foo 是不是 Foo 類的實例 function Foo(){} var foo = new Foo(); console.log(foo instanceof Foo)//true
缺點:1.由於數組屬於object中的一種,因此數組instanceof object,也是true.
var a={}; a instanceof Object //true a intanceof Array //false var b=[]; b instanceof Array //true b instanceof Object //true
缺點:2.instanceof不能區分基本類型string和boolean,除非是字符串對象和布爾對象
var c='abc'; c instanceof String; //false var d=new String(); d instanceof String //true
2.constructor
除了undefined和null,其餘類型的變量均能使用constructor判斷出類型.
缺點:這個方法容易被改寫