javascript中的數(shù)據(jù)類型檢測方法詳解
本文實(shí)例講述了javascript中的數(shù)據(jù)類型檢測方法。分享給大家供大家參考,具體如下:
在javascript中數(shù)據(jù)類型
值類型: 布爾(Boolean),數(shù)值(Number),字符(String),空(Null),未定義(Undefined)
引用類型: 對象(Object),函數(shù)(Function),數(shù)組(Array),日期(Date),正則(RegExp)等等。
檢測方式之 typeof
console.log(typeof undefined)//'undefined'
console.log(typeof null) // object
console.log(typeof true) //'boolean'
console.log(typeof 123) //'number'
console.log(typeof NaN) //'number'
console.log(typeof "abc") //'string'
console.log(typeof function() {}) //'function'
var arr=[];
console.log(typeof {}) //'object'
console.log(typeof arr)//'object'
從上面可以看出來用 typeof 來檢測,不嚴(yán)謹(jǐn)。
null 被檢測成為了 object, null 值表示一個(gè)空對象指針,用typeof操作符檢測null值時(shí)會(huì)返回object的原因, 這是在設(shè)計(jì)ECMAscript時(shí)候存在的一些bug。
同樣是js不嚴(yán)謹(jǐn)?shù)囊环N表現(xiàn)形式。而數(shù)組也被檢測成為了一個(gè)對象, 所以用這種方式不嚴(yán)謹(jǐn)。
檢測方式之 toString.call()
console.log(toString.call(undefined) ) // '[object Window]''
console.log(toString.call(null) ) // '[object Window]'
console.log(toString.call(true) ) // '[object Boolean]'
console.log(toString.call(123) ) // '[object Number]'
console.log(toString.call(NaN) ) // '[object Number]'
console.log(toString.call("abc") ) // '[object String]'
console.log(toString.call(function() {})) // '[object Function]'
var arr=[];
console.log(toString.call({}) ) // '[object Object]'
console.log(toString.call(arr) ) // '[object Array]'
可以看出來出了undefined和null 這兩個(gè),其他的檢測都還是比較嚴(yán)謹(jǐn)?shù)摹?/p>
其中toString()函數(shù)是window的一個(gè)不可枚舉函數(shù),繼承自O(shè)bject
還可以寫成這樣:
window.toString.call('hello'); // "[object String]"
Object.prototype.toString.call('hello'); // "[object String]"
檢測方式之 constructor
console.log('haha'.constructor == String); // true
console.log([].constructor === Array); // true
console.log({}.constructor === Object); // true
console.log(true.constructor === Boolean); // true
var a = 111; // 此處必須要用變量來代表數(shù)字,不然會(huì)報(bào)錯(cuò),從這也能看出來js是一門不嚴(yán)謹(jǐn)?shù)恼Z言
console.log(a.constructor === Number); // true
我們通過把實(shí)例的構(gòu)造函數(shù)指向其他地方,來改變它的constructor,就不安全了,不推薦使用 如下代碼所示:
var AAA = function(){}; // 定義一個(gè)AAA對象
AAA.prototype = {
say:function() {
alert('hello');
}
}
var arr1 = new Array(); // 定義一個(gè)數(shù)組
arr1.constructor = function AAA(){}; // 這里可以改變實(shí)例的constructor。
arr1.__proto__ = AAA.prototype; // 此處改變了原型鏈
console.log(arr1.constructor); // AAA
console.log(arr1 instanceof AAA); // true 原型鏈已經(jīng)改變,arr1 已經(jīng)不屬于Array了。
console.log(arr1 instanceof Array); // false
// 下面我們來讓AAA的原型鏈連到 Array上
AAA.prototype.__proto__ = Array.prototype;
console.log(arr1 instanceof Array); // true
檢測方式之 instanceof
檢測是否是某一對象的實(shí)例
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log('haha' instanceof String); // false
console.log(true instanceof Boolean); // false
console.log(1 instanceof Number); // false
前面兩個(gè)是true,后面的全是false 說明了用 A instanceof B 來檢測的前提條件必須是A,B都為對象,通過下面的方式就可以看出來了
var a = new Number(1);
var b = new String('haha');
var t = new Boolean(true);
console.log(a instanceof Number); // true
console.log(b instanceof String); // true
console.log(t instanceof Boolean); // true
此種方式也不安全,后面會(huì)有闡述,有關(guān)instanceof 和 isPrototypeOf的區(qū)別,我們以后再來探討
還有一種is的方式比如:Array.isArray() 專門用來檢測數(shù)組
console.log(Array.isArray([])); // true
這個(gè)有兼容問題,IE8及其以下版本瀏覽器不被支持
而jQuery里面也給我們提供了一些解決方案
jQuery.isArray():是否為數(shù)組。
jQuery.isEmptyObject():是否為空對象(不含可枚舉的屬性)。
jQuery.isFunction():是否為函數(shù)。
jQuery.isNumeric():是否為數(shù)字。
jQuery.isPlainObject():是否為使用“{}”或“new Object”生成的對象,而不是瀏覽器原生提供的對象。
jQuery.isWindow():是否為window對象。
jQuery.isXMLDoc():判斷一個(gè)DOM節(jié)點(diǎn)是否處于XML文檔之中。
總結(jié)
通過以上幾種方式,我們知道在不同的時(shí)候用不同的檢測方式,是一種有效的解決方案。
拓展
在number類型中,還有一種檢測是有窮數(shù)字的方法叫 isFinite(), 比如任何數(shù)字除以0,都為無窮大。Infinity,-Infinity,非數(shù)字都會(huì)被判為false
console.log(3/0); // Infinity
console.log(-3/0); // -Infinity
console.log(isFinite(3/0)); // false
console.log(isFinite(-3/0)); // false
console.log(isFinite(NaN)); // false
console.log(isFinite('haha')); // false
console.log(isFinite(true)); // true 在這里 true 被轉(zhuǎn)換成了數(shù)字 1
console.log(isFinite(false)); // true 在這里 false 被轉(zhuǎn)換成了數(shù)字 0
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript操作DOM技巧總結(jié)》、《JavaScript頁面元素操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript查找算法技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript talbe表中指定位置插入一行的實(shí)現(xiàn)代碼 腳本之家修正版
用js實(shí)現(xiàn)的在table中指定的位置插入一行,先點(diǎn)一下表中你想插入的位置,點(diǎn)擊即可。2009-06-06
解決mui框架中switch開關(guān)通過js控制開或者關(guān)狀態(tài)時(shí)小圓點(diǎn)不動(dòng)的問題
今天小編就為大家分享一篇解決mui框架中switch開關(guān)通過js控制開或者關(guān)狀態(tài)時(shí)小圓點(diǎn)不動(dòng)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JSON.parse處理非標(biāo)準(zhǔn)Json數(shù)據(jù)出錯(cuò)的解決
這篇文章主要介紹了JSON.parse處理非標(biāo)準(zhǔn)Json數(shù)據(jù)出錯(cuò)的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
JS getAttribute和setAttribute(取得和設(shè)置屬性)的使用介紹
本篇文章是對JS中的getAttribute和setAttribute(取得和設(shè)置屬性)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07
原生js實(shí)現(xiàn)改變隨意改變div屬性style的名稱和值的結(jié)果
在本文將為大家介紹下如何用原生js和jQuery實(shí)現(xiàn)隨意改變div屬性,和重置,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下,希望對大家有所幫助2013-09-09

