判斷javaScript數據類型,也就是我們說的類型檢測,有五種方法:分別是typeof運算符,instanceof操作符,Object.PRototype.toString方法,constructor屬性,duck type,這部分我推薦大家看看阮大大寫的Javascript標準參考教程
使用typeof檢測對象類型:
typeo作為最常用的檢測類型的方法,返回字符串類型,適合函數對象和基本類型(JavaScripe中的基本類型:number,string,boolean,null,undefined,object[對象])的判斷
typeof 100 //"number"typeof true //"boolean"typeof function //"function"typeof undefined //"undefined"typeof new Object() //"object"typeof [1,2] //"object"typeof NaN //"number"typeof null //"object"可以看到,對于最基本的類型可以測試出類型,但對于其他的,包括日期,數組等大多都返回object類型,而且null也返回的是object類型,也就是沒有辦法知道確切的類型
使用instanceof檢測對象類型:
obj instanceof Object:左邊操作數obj為對象(如果不小心寫成基本類型,比如數字啥的,就會返回false),右邊操作數Object為函數對象或者是函數構造器,否則拋出TypeError
實質就是:instanceof操作符判斷左操作數對象的原型鏈上是否有右邊這個構造函數的prototype屬性,也就是說指定對象是否是某個構造函數的實例,最后返回布爾值,這個對整個原型鏈上的對象都是有效的,由于instanceof對整個原型鏈上的對象都有效,因此同一個實例對象,可能會對多個構造函數都返回true!
[1,2] instanceof Array //truenew Object() instanceof Array /false再某些ie版本中存在跨iframe問題,每個iframe下都有自己的一套原型鏈,跨frame實例化的對象彼此是不共享原型鏈,所以不同window或iframe間的對象類型檢測不能使用instanceof!!!
使用Object.prototype.toString方法:
Object.prototype.toString.apply([]); //"[object Array]"Object.prototype.toString.apply(function(){}) //"[object Function]"Object.prototype.toString.apply(null) //"[object Null]"Object.prototype.toString.apply(undefined) //"[object Undefined]"http://IE/7/8的Object.protope.toString.apply(null) //[object Object]"使用constructor屬性:
所有實例對象都有constructor屬性,constructor屬性指向prototype對象所在的構造函數,就是說指向創建這個實例的構造函數,還是推薦阮大大的文章,看這個constructor屬性
使用duck type(鴨子類型):
比如判斷一個對象是否是數組,可以看這個對象是否擁有length()等方法,不禁想到類數組轉數組的方法,看這里類數組轉數組了
JavaScript之類型檢測的總結:
1.typeof:適合基本類型和function檢測,遇到null失效
2.通過{}.toString拿到,適合內置對象和基本類型,遇到null和undefined失效
3.instanceof:適合自定義對象,也可以用來檢測原生對象,在不同iframe和window間檢測時失效
來看一道面試題:怎么判斷一個變量類型是不是數組?
1.通過constructor(不推薦使用):
[].constructor===Array //true2.通過instanceof:
[] instanceof Array //true在頁面中含多個窗體或者iframe,那么會產生很多執行環境,一個iframe下的數組不是另一個窗體下構造函數的實例,那么如果出現這種極端條件,instanceof也不推薦使用
3.通過Array.isArray:
//在新版瀏覽器,IE9+都已經實現了原生方法:Array.isArray([1,2]); //true4.通過toSting:
Object.prototype.toString.call([]) === '[object Array]'新聞熱點
疑難解答