如何檢測JavaScript的各種類型
一、先介紹下5種原始類型
JavaScript中5種原始類型為string,number,boolean,undefined,null
var name = "Jack"; var age = 32; var single = false; var app; //undefined console.log(typeof name); //string console.log(typeof age); //number console.log(typeof single); //boolean console.log(typeof app); //undefined console.log(typeof null); //object
發(fā)現(xiàn)除null外的其他4種基本類型均可以用typeof來識別:
if(typeof name === "string") { name += "Zhang"; }
if(typeof age === "number") { age++; }
if(typeof single === "boolean" && single) { … }
if(typeof app === "undefined") { app = {}; }
因為typeof null會得到object,所以直接用===來檢測null:
if(el === null) { … }
二、對象
JavaScript的對象包括內(nèi)置對象(Date,RegExp ,Error等)和自定義對象。
(注意,F(xiàn)unction和Array雖然也都是內(nèi)置對象,但下一節(jié)單獨講)
對象不能像基本類型那樣用typeof來檢測了,因為檢測出來的結(jié)果都是object:
console.log(typeof new Date()); //object console.log(typeof new RegExp()); //object console.log(typeof new Error()); //object console.log(typeof new Person()); //用typeof檢測出自定義對象也是object
要改用instanceof來檢測:
var date = new Date();
var reg = new RegExp();
var err = new Error();
var me = new Person();
if(date instanceof Date) { //檢測日期
year = date.getFullYear();
}
if(reg instanceof RegExp) { //檢測正則表達(dá)式
reg.test(...);
}
if(err instanceof Error) { //檢測異常
throw err;
}
if(me instanceof Person) { //檢測自定義對象
...
}
但自定義對象有個問題,假設(shè)瀏覽器frameA里和frameB里都定義了Person。 frameA里定義了me對象,用me instanceof Person檢測出來為true。但當(dāng)自定義對象me傳給frameB后,在frameB里instanceof會是false。
本節(jié)一開頭就說了,F(xiàn)unction和Array雖然也都是內(nèi)置對象,但留到下一節(jié)講。原因就是Function和Array也有和自定義對象相同的上述問題。因此Function和Array一般不用instanceof
三、Function
上面說了用instanceof檢測Function不能跨frame。因此用typeof來檢測,它可跨frame:
var func = function(){};
if(typeof func === 'function') { … }
但I(xiàn)E8以前用typeof來檢測DOM系函數(shù)會得到object,因此IE8以前改用in:
console.log(typeof document.getElementById); //object,不是function
console.log(typeof document.getElementsByTagName); //object,不是function
console.log(typeof document.createElement); //object,不是function
//IE8以前的IE瀏覽器,要改用in來檢測是否支持DOM函數(shù)
if("getElementById" in document) { … }
if("getElementsByTagName" in document) { … }
if("createElement" in document) { … }
四、Array
上面說了用instanceof檢測Array不能跨frame。ES5之前都自定義檢測方法。其中最精確的方法:依賴Array的toString會返回固定字符串”[Object Array]”的事實來檢測:
function isArray(arr) {
return Object.prototype.toString.call(arr) === "[Object Array]";
}
該方法精確且優(yōu)雅,因此被很多庫所采納,最終在ES5被作為isArray方法引入了Array,參照MDN?,F(xiàn)在你不需要自定義檢測方法了,直接用isArray()即可。
其他檢測方法,都各有缺陷,不能100%精確。但作為一種思路是可以借鑒的。例如依賴Array是唯一包含sort方法的對象的事實來檢測:
function isArray(arr) {
return typeof arr.sort === "function";
}
如果是自定義對象也定義了sort方法,該方法就失效了。
五、屬性
檢測屬性是否在實例對象中應(yīng)該用hasOwnProperty。如果你不關(guān)心屬性是在實例對象中還是在原型對象中,可以簡單點用in
例如檢測字面量對象屬性:
var Person = {
name: "Jack",
age: 33
};
if("name" in Person) { … } //true
if(Person.hasOwnProperty("name")) { … } //true
例如實例對象屬性:
var Person = function (name, age) {
this.name = name;
this.age = age;
};
Person.prototype.location = "Shanghai";
var me = new Person("Jack", 33)
if("name" in me) { … } //true
if(me.hasOwnProperty("name")) { … } //true
if("location" in me) { … } //true
if(me.hasOwnProperty("location")) { … }//false
除此之外其他方法都不好:
if (object[propName]) //Not Good,你怎么知道屬性值不是0或1? if (object[propName] === null) //Not Good,你怎么知道屬性值不是null? if (object[propName] === undefined) //Not Good,你怎么知道屬性值不是undefined?
總結(jié)
用typeof檢測string,number,boolean,undefined,F(xiàn)unction
用===檢測null
用isArray()檢測Array
用instanceof檢測內(nèi)置對象(除Function和Array)和自定義對象
用hasOwnProperty檢測屬性是否在實例對象中。如果你不關(guān)心屬性是在實例對象中還是在原型對象中,可以簡單點用in
好了,本篇介紹如何檢測JavaScript各種類型的內(nèi)容就到這里了,希望大家能夠認(rèn)真學(xué)習(xí)本文的內(nèi)容,或許對大家學(xué)習(xí)JavaScript有所幫助。
- JavaScript類型檢測的方法實例教程
- JS數(shù)組索引檢測中的數(shù)據(jù)類型問題詳解
- 詳解JavaScript中的數(shù)據(jù)類型,以及檢測數(shù)據(jù)類型的方法
- javascript中的數(shù)據(jù)類型檢測方法詳解
- js數(shù)據(jù)類型檢測總結(jié)
- js學(xué)習(xí)總結(jié)_基于數(shù)據(jù)類型檢測的四種方式(必看)
- JS檢測數(shù)組類型的方法小結(jié)
- 在javaScript中檢測數(shù)據(jù)類型的幾種方式小結(jié)
- javascript基本數(shù)據(jù)類型及類型檢測常用方法小結(jié)
- JS中檢測數(shù)據(jù)類型的幾種方式及優(yōu)缺點小結(jié)
- JS正則表達(dá)式匹配檢測各種數(shù)值類型(數(shù)字驗證)
- JavaScript類型檢測之typeof 和 instanceof 的缺陷與優(yōu)化
- JavaScript學(xué)習(xí)筆記之檢測客戶端類型是(引擎、瀏覽器、平臺、操作系統(tǒng)、移動設(shè)備)
- Javascript實現(xiàn)檢測客戶端類型代碼封包
- JavaScript 檢測文件的類型的方法
相關(guān)文章
JavaScript調(diào)用客戶端Java程序的方法
這篇文章主要介紹了JavaScript調(diào)用客戶端Java程序的方法,實例分析了javascript調(diào)用java程序的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07
js實現(xiàn)的驗證,學(xué)習(xí)用js控制td
JS日積月累001 - rows 和 cells的使用2008-12-12
Knockoutjs 學(xué)習(xí)系列(二)花式捆綁
這篇文章主要介紹了Knockoutjs 學(xué)習(xí)系列(二)花式捆綁 的相關(guān)資料,主要介紹了knockoutjs中各種綁定的使用方法,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06

