能檢測的方法很多 基本上的疑惑點是如何檢測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 為什么不准
因為當他在檢測null array object的時候 都是object,這是因為這幾個都是Object重寫的實例 這個也會幫助我們理解標題的疑惑
2.Object.prototype.toString.call(obj) 為什么有用
toString方法返回反映這個對象的字符串
為什么它就能准確判斷類型呢,為什么用Object.tostring 方法就不行呢
還是那一句話 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)一樣了
擴展:其他能檢測類型的方法
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判斷出類型.
缺點:這個方法容易被改寫