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