摘要:類(lèi)型檢測(cè)在中提供兩種檢測(cè)類(lèi)型的方法,但是它們并不總是靠譜。引用類(lèi)型引用類(lèi)型使用檢測(cè),返回都是。這個(gè)時(shí)候可以用,它的語(yǔ)法是實(shí)例對(duì)象構(gòu)造函數(shù)不僅能檢測(cè)構(gòu)造對(duì)象的構(gòu)造器,還檢測(cè)原型鏈。
類(lèi)型檢測(cè)
在js中提供兩種檢測(cè)類(lèi)型的方法,但是它們并不總是靠譜。
typeof
instanceof
下面我們來(lái)看看各個(gè)類(lèi)型的應(yīng)該如何進(jìn)行檢測(cè)比較靠譜
1. 基本類(lèi)型基本類(lèi)型(除null之外)的檢測(cè)使用typeof,它的語(yǔ)法很簡(jiǎn)單
var number = 1, string = "s", boolean = true, un = undefined, typeof number; // "number" typeof string; // "string" typeof boolean;// "boolean" typeof un; // "undefined"1.2 null
如果我們使用typeof來(lái)檢測(cè),結(jié)果會(huì)是
var n = null; typeof n;//"object"
有人說(shuō)這是個(gè)bug,有人說(shuō)這是因?yàn)閚ull本身就代表著一個(gè)空對(duì)象,我們也經(jīng)常用null來(lái)解除引用。不管怎么說(shuō),我們可以這樣檢測(cè)null
var n = null; function isNull(n){ if(!n && typeof n !== "undefined"){ return true; } return false; } isNull(n);// true1.3 非數(shù)字
判斷一個(gè)變量是否是數(shù)字,可以使用isNaN(),這個(gè)方法的意思是is not a numher,也就是說(shuō)返回true的時(shí)候說(shuō)明變量不是一個(gè)數(shù)字。
var a = 1, b = "s", c = "1"; isNaN(a); // false isNaN(b); // true isNaN(c); // true2. 引用類(lèi)型
引用類(lèi)型使用typeof檢測(cè),返回都是"object"。這其實(shí)沒(méi)什么意義,我們要知道的是變量具體是哪個(gè)引用類(lèi)型的,例如數(shù)組,自定義的類(lèi)型等等。這個(gè)時(shí)候可以用instanceof,它的語(yǔ)法是
實(shí)例 instanceof 對(duì)象構(gòu)造函數(shù)
var arr = []; arr instanceof Array; // true function Person(){}; var p = new Person(); p instanceof Person; // true
instanceof不僅能檢測(cè)構(gòu)造對(duì)象的構(gòu)造器,還檢測(cè)原型鏈。
var now = new Date(); now instanceof Date; // true now instanceof Object; // true2.1 數(shù)組檢測(cè)
數(shù)組在編程中相當(dāng)常見(jiàn),在框架中也是,如何準(zhǔn)確地檢測(cè)數(shù)組類(lèi)型,是相當(dāng)重要的。
可能有人會(huì)說(shuō)了,使用instanceof不就可以了。非也。在js中,有一個(gè)很古老的跨域問(wèn)題:在iframe之間來(lái)回傳遞數(shù)組,而instanceof不能跨幀。
什么叫不能跨幀?假設(shè)在一個(gè)瀏覽器的幀(frame A)里的一個(gè)對(duì)象傳入到另外一個(gè)幀(frame B)中,兩個(gè)幀都定義了一個(gè)構(gòu)造函數(shù)Person,如果來(lái)自幀A的對(duì)象是幀APerson的實(shí)例,則
frameAPersonInstance instanceof frameAPerson; //true
frameAPersonInstance instanceof frameBPerson; //false
那怎么辦?
首先,有人提出了使用duck typing的思路來(lái)解決這個(gè)問(wèn)題,duck typing的意思就是:像鴨子一樣走路、游泳并且嘎嘎叫的就是鴨子,這是個(gè)很有意思的想法,它的本質(zhì)就是我們關(guān)注對(duì)象能做什么,不是關(guān)注對(duì)象是什么,采用這樣的思路,我們檢測(cè)對(duì)象實(shí)例是否有sort屬性來(lái)判斷對(duì)象實(shí)例是否是一個(gè)數(shù)組,具體實(shí)現(xiàn)如下
function isArray(value) { return typeof value.sort === "function"; }
之后,kangax發(fā)現(xiàn)了一個(gè)很有趣的現(xiàn)象,調(diào)用某個(gè)值的內(nèi)置toString()方法在所有瀏覽器中都返回標(biāo)準(zhǔn)的字符串結(jié)果,對(duì)于數(shù)組來(lái)說(shuō),返回的字符串為"[object Array]",這個(gè)方法對(duì)識(shí)別內(nèi)置對(duì)象都非常有效,因此jq也是采取了這種方式來(lái)實(shí)現(xiàn)的isArray()的方法。
function isArray(value) { return Object.prototype.toString.call(value) === "[object Array]"; }
之后,ECMA5將Array.isArray()正式引入JavaScript,提供了一個(gè)能準(zhǔn)確檢測(cè)一個(gè)變量是否為數(shù)組類(lèi)型的
Array.isArray(variable);3. 最后
到這里,你以為已經(jīng)解決了所有的類(lèi)型檢測(cè)問(wèn)題了嗎?并不是。在《JavaScript框架設(shè)計(jì)》這本書(shū)中,詳細(xì)地談?wù)摳鞣N類(lèi)型檢測(cè)的兼容性問(wèn)題,并且在massframework給出了一個(gè)很不錯(cuò)的實(shí)現(xiàn),從代碼里面來(lái)學(xué)習(xí)可以學(xué)到更多。
// 建立類(lèi)型的映射 var class2type = { "[objectHTMLDocument]" : "Document", "[objectHTMLCollection]" : "NodeList", "[objectStaticNodeList]" : "NodeList", "[objectIXMLDOMNodeList]" : "NodeList", "[objectDOMWindow]" : "Window", "[object global]" : "Window", //safari 4.04 "null" : "null", "NaN" : "NaN", "undefined" : "undefined" }; // 正常情況下的類(lèi)型 "Boolean,Number,String,Function,Array,Date,RegExp,Window,Document,Arguments,NodeList" .replace(/[^, ]/g, function(name) { class2type["[object " + name + "]"] = name; }); var toString = class2type.toString; mass.type = function(obj,str){ var result = class2type[ (obj == null || obj !== obj) ? obj : toString.call(obj) ] || obj.nodeName || "#"; if(result.charAt(0) === "#" ){ //兼容舊版瀏覽器與處理個(gè)別情況,如window.opera //hack,利用IE6,IE7,IE8 window == document 為 true,document == window 為 false的特性 if(obj == obj.document && obj.document != obj){ result = "Window"; } else if (obj.nodeType === 9){ //nodeType 屬性返回以數(shù)字值返回指定節(jié)點(diǎn)的節(jié)點(diǎn)類(lèi)型。9代表document result = "Document"; } else if (obj.callee){ //arguments 特有的屬性 resutl = "Arguments"; } else if (isFinite(obj.length) && obj.item){ //obj.item()方法,可返回節(jié)點(diǎn)列表中處于指定的索引號(hào)的節(jié)點(diǎn)。 result = "NodeList"; } else { result = toString.call(obj).slice(8,-1); //[object XXXX] } } //提供一個(gè)進(jìn)行類(lèi)型比較的功能 if(str){ return str === result; } return result; }4. 參考
《編寫(xiě)可維護(hù)的JavaScript》
《JavaScript框架設(shè)計(jì)》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87855.html
摘要:檢測(cè)函數(shù)從技術(shù)上講,中的函數(shù)是引用類(lèi)型,同樣存在構(gòu)造函數(shù),每個(gè)函數(shù)都是其實(shí)例,比如不好的寫(xiě)法然而,這個(gè)方法亦不能跨幀使用,因?yàn)槊總€(gè)幀都有各自的構(gòu)造函數(shù),好在運(yùn)算符也是可以用于函數(shù)的,返回。 上周寫(xiě)過(guò)一篇讀書(shū)筆記《編寫(xiě)可維護(hù)的JavaScript》之編程實(shí)踐,其中 第8章 避免『空比較』是博主在工作中遇坑較多的雷區(qū),所以特此把該章節(jié)重新整理分享,希望大家不再坑隊(duì)友(>﹏<)。 在 Jav...
摘要:中的數(shù)據(jù)類(lèi)型及其檢測(cè)數(shù)據(jù)類(lèi)型基本類(lèi)型引用類(lèi)型類(lèi)型檢測(cè)只能檢測(cè)基本數(shù)據(jù)類(lèi)型,對(duì)于還有一個(gè)用于檢測(cè)某個(gè)對(duì)象的原型鏈?zhǔn)欠癜硞€(gè)構(gòu)造函數(shù)的屬性適用于檢測(cè)對(duì)象,它是基于原型鏈運(yùn)作的屬性返回一個(gè)指向創(chuàng)建了該對(duì)象原型的函數(shù)引用,該屬性的值是哪個(gè)函數(shù)本身 JavaScript中的數(shù)據(jù)類(lèi)型及其檢測(cè) 1. 數(shù)據(jù)類(lèi)型 1.1 基本類(lèi)型 Number String Boolean Null Undefin...
摘要:種原始類(lèi)型對(duì)象屬性種原始類(lèi)型中種原始類(lèi)型為,,,,發(fā)現(xiàn)除外的其他種基本類(lèi)型均可以用來(lái)識(shí)別因?yàn)闀?huì)得到,所以直接用來(lái)檢測(cè)對(duì)象的對(duì)象包括內(nèi)置對(duì)象,,等和自定義對(duì)象。其他檢測(cè)方法,都各有缺陷,不能精確。屬性檢測(cè)屬性是否在實(shí)例對(duì)象中應(yīng)該用。 本篇介紹一下如何檢測(cè)JavaScript各種類(lèi)型。 ? 5種原始類(lèi)型? 對(duì)象? Function? Array? 屬性 5種原...
摘要:用來(lái)檢測(cè)數(shù)據(jù)類(lèi)型的運(yùn)算符語(yǔ)法雖然是基本數(shù)據(jù)類(lèi)型值,但是它屬于空對(duì)象指針,檢測(cè)的結(jié)果是對(duì)象使用有自己的局限性,不能具體細(xì)分當(dāng)前的值是數(shù)組還是正則也就是不能細(xì)分對(duì)象類(lèi)型的值先算檢測(cè)某一個(gè)實(shí)例是否屬于某各類(lèi)的實(shí)例構(gòu)造函數(shù)使用檢測(cè)某個(gè)值是否屬于某 typeof 用來(lái)檢測(cè)數(shù)據(jù)類(lèi)型的運(yùn)算符語(yǔ)法:typeof[value] typeof 12 //=>number typeof NaN //=>nu...
摘要:當(dāng)需要變量是否是類(lèi)型時(shí),可以使用進(jìn)行判斷。本來(lái)是原型對(duì)象上的屬性,指向構(gòu)造函數(shù)。不過(guò)使用也不是保險(xiǎn)的,因?yàn)閷傩允强梢员恍薷牡?,?huì)導(dǎo)致檢測(cè)出的結(jié)果不正確,例如在上面的例子中,原型中的被修改為指向到,導(dǎo)致檢測(cè)不出實(shí)例對(duì)象真實(shí)的構(gòu)造函數(shù)。 在JavaScript中,有5種基本數(shù)據(jù)類(lèi)型和1種復(fù)雜數(shù)據(jù)類(lèi)型,基本數(shù)據(jù)類(lèi)型有:Undefined, Null, Boolean, Number和Stri...
閱讀 678·2023-04-26 02:03
閱讀 1045·2021-11-23 09:51
閱讀 1159·2021-10-14 09:42
閱讀 1750·2021-09-13 10:23
閱讀 974·2021-08-27 13:12
閱讀 850·2019-08-30 11:21
閱讀 1010·2019-08-30 11:14
閱讀 1053·2019-08-30 11:09