方法一之 instanceof
instance,故名思義,實(shí)例,例子,所以instanceof 用于判斷一個(gè)變量是否某個(gè)對(duì)象的實(shí)例,是一個(gè)三目運(yùn)算式---和typeof最實(shí)質(zhì)上的區(qū)別
a instanceof b?alert("true"):alert("false") //注意b值是你想要判斷的那種數(shù)據(jù)類型,不是一個(gè)字符串,比如Array
舉個(gè)栗子:
方法二之 constructor
在W3C定義中的定義:constructor 屬性返回對(duì)創(chuàng)建此對(duì)象的數(shù)組函數(shù)的引用
就是返回對(duì)象相對(duì)應(yīng)的構(gòu)造函數(shù)。從定義上來說跟instanceof不太一致,但效果都是一樣的
如: (a instanceof Array) //a是否Array的實(shí)例?true or false
(a.constructor == Array) // a實(shí)例所對(duì)應(yīng)的構(gòu)造函數(shù)是否為Array? true or false
舉個(gè)栗子:
那么判斷各種類型的方法就是:
較為嚴(yán)謹(jǐn)并且通用的方法:
!!注意:
使用instaceof和construcor,被判斷的array必須是在當(dāng)前頁面聲明的!比如,一個(gè)頁面(父頁面)有一個(gè)框架,框架中引用了一個(gè)頁面(子頁面),在子頁面中聲明了一個(gè)array,并將其賦值給父頁面的一個(gè)變量,這時(shí)判斷該變量,Array == object.constructor;會(huì)返回false;
原因:
1、array屬于引用型數(shù)據(jù),在傳遞過程中,僅僅是引用地址的傳遞。
2、每個(gè)頁面的Array原生對(duì)象所引用的地址是不一樣的,在子頁面聲明的array,所對(duì)應(yīng)的構(gòu)造函數(shù),是子頁面的Array對(duì)象;父頁面來進(jìn)行判斷,使用的Array并不等于子頁面的Array;切記,不然很難跟蹤問題!
方法三之 特性判斷法
以上方法均有一定的缺陷,但要相信人民大眾的智慧是無所不能及的,我們可根據(jù)數(shù)組的一些特性來判斷其類型
有l(wèi)ength和splice并不一定是數(shù)組,因?yàn)榭梢詾閷?duì)象添加屬性,而不能枚舉length屬性,才是最重要的判斷因子。
ps: 在這里普及下 propertyIsEnumerable 方法:
object. propertyIsEnumerable(proName)
判斷指定的屬性是否可列舉
備注:如果 proName 存在于 object 中且可以使用一個(gè) For…In 循環(huán)窮舉出來,那么 propertyIsEnumerable 屬性返回 true。如果 object 不具有所指定的屬性或者所指定的屬性不是可列舉的,那么 propertyIsEnumerable 屬性返回 false。
propertyIsEnumerable 屬性不考慮原型鏈中的對(duì)象。
示例:
方法四之 最簡(jiǎn)單的方法
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com