詳解如何準(zhǔn)確判斷JavaScript中的數(shù)據(jù)類型
一、前言
在JavaScript中,我們經(jīng)常需要判斷數(shù)據(jù)類型以便于正確地處理數(shù)據(jù)。本文將介紹JavaScript中的數(shù)據(jù)類型判斷技術(shù),包括typeof操作符、instanceof操作符、Object.prototype.toString方法以及ES6新增的一些數(shù)據(jù)類型判斷方法。
二、typeof 操作符
操作符typeof
用于判斷一個值的數(shù)據(jù)類型,返回的結(jié)果是一個字符串。常見的typeof
返回值包括"`number"、"string"、"boolean"、"undefined"、"object"和"function"。
console.log(typeof 'hello'); //輸出: string console.log(typeof('hello')); //輸出: string console.log(typeof 666); //輸出: number console.log(typeof(666)); //輸出: number console.log(typeof true); //輸出: boolean console.log(NaN); //輸出: NaN console.log(typeof NaN); //輸出: number console.log(typeof undefined); //輸出: undefined console.log(typeof new Date()); //輸出: object console.log(typeof null); //輸出: object console.log(typeof []); //輸出: object console.log(typeof {}); //輸出: object console.log(typeof function() {}); //輸出: function
需要注意的是,typeof null
返回的是object
而不是null
,typeof
能判斷除了null
之外的所有數(shù)據(jù)類型。這是一個歷史遺留問題,不能用來判斷null
值。如果要判斷null
值,可以使用"==="
運算符。 typeof
判斷所有引用類型都是輸出object
,除了函數(shù)function
,用typeof
判斷函數(shù)類型輸出的是function
。
三、instanceof 操作符
instanceof
操作符用于判斷一個對象是否屬于某個類(構(gòu)造函數(shù))的實例。它會檢查對象的原型鏈?zhǔn)欠癜瑯?gòu)造函數(shù)的原型對象。
console.log("hello world" instanceof String) //false console.log(new String("hello world") instanceof String) //true console.log(666 instanceof Number) //false console.log(new Number(666) instanceof Number) //true console.log(true instanceof Boolean) //false console.log([] instanceof Array) //true console.log({} instanceof Object) //true console.log(null instanceof null) //報錯 console.log(undefined instanceof undefined) //報錯
需要注意的是,typeof null
返回的是object
而不是null
,typeof
能判斷除了null
之外的所有數(shù)據(jù)類型。這是一個歷史遺留問題,不能用來判斷null
值。如果要判斷null
值,可以使用"==="
運算符。 typeof
判斷所有引用類型都是輸出object
,除了函數(shù)function
,用typeof
判斷函數(shù)類型輸出的是function
。
四、Object.prototype.toString 方法
Object.prototype.toString
方法可以返回一個對象的數(shù)據(jù)類型。它比typeof
和instanceof
更加準(zhǔn)確和全面,可以判斷基本數(shù)據(jù)類型和各種對象類型。
console.log(Object.prototype.toString(undefined)); //[object Object] console.log(Object.prototype.toString(666)); //[object Object] console.log(Object.prototype.toString.call(undefined))//[object Undefined] console.log(Object.prototype.toString.call(null)); //[object Null] console.log(Object.prototype.toString.call(666)); //[object Number] console.log(Object.prototype.toString.call('abc')); //[object String] console.log(Object.prototype.toString.call(NaN)); //[object Number] console.log(Object.prototype.toString.call([1,2,3])); //[object Array] console.log(Object.prototype.toString.call({a:1,b:2}))//[object Object] console.log(Object.prototype.toString.call(function(){}))//[object Function] console.log(Object.prototype.toString.call(new Date()))//[object Date] console.log(Object.prototype.toString.call(arguments)) //[object Arguments]
需要注意的是,如果不加上call
,就會輸出[object Object]
,加上后才能準(zhǔn)確判斷。我們仔細(xì)觀察一下,發(fā)現(xiàn)輸出的結(jié)果中并不全是我們需要的信息,我們似乎只需要后半部分。那么怎樣只輸出后半部分呢?
Object.prototype.toString(undefined).slice(8,-1) //Object Object.prototype.toString(666).slice(8,-1) //Object Object.prototype.toString({}).slice(8,-1) //Object Object.prototype.toString.call(undefined).slice(8,-1) //Undefined Object.prototype.toString.call(null).slice(8,-1) //Null Object.prototype.toString.call(666).slice(8,-1) //Number Object.prototype.toString.call('abc').slice(8,-1) //String Object.prototype.toString.call(NaN).slice(8,-1) //Number Object.prototype.toString.call([1,2,3]).slice(8,-1) //Array Object.prototype.toString.call({a:1,b:2}).slice(8,-1) //Object Object.prototype.toString.call(function () {}).slice(8,-1) //Function Object.prototype.toString.call(new Date()).slice(8,-1) //Date
因代碼過長不便展示,請各位自行加上console.log()
。前半部分的[object
是固定的,后半部分長度不固定,所以我們這里采用slice(8,-1)
,8
表示從第八位開始截取,不包括第八位,-1
表示從右往左數(shù)除掉一位,也就是去掉右中括號。
五、ES6 新增的數(shù)據(jù)類型判斷方法
ES6新增了一些數(shù)據(jù)類型判斷方法,包括Number.isNaN
、Number.isFinite
、Array.isArray
、Object.is
等方法。
1. Number.isNaN
Number.isNaN
方法用于判斷一個值是否為NaN
,它比全局的isNaN
方法更加嚴(yán)格,只有在值為NaN
時返回true
,其他情況都返回false
。
console.log(Number.isNaN(NaN)); //true console.log(Number.isNaN(42)); //false console.log(Number.isNaN("hello world"));//false console.log(Number.isNaN(undefined)); //false console.log(Number.isNaN(null)); //false
2. Number.isFinite
Number.isFinite
方法用于判斷一個值是否為有限數(shù)值,它在值為Infinity
、-Infinity
和NaN
時返回false
,其他情況都返回true
。Number.isFinite
只能判斷數(shù)值類型的數(shù)據(jù)是否為有限數(shù)值,對于其他數(shù)據(jù)類型返回都是false
。
console.log(Number.isFinite(0)); //true console.log(Number.isFinite(-16)); //true console.log(Number.isFinite(42)); //true console.log(Number.isFinite(Infinity)); //false console.log(Number.isFinite(-Infinity)); //false console.log(Number.isFinite(NaN)); //false console.log(Number.isFinite("hello world"));//false console.log(Number.isFinite(undefined)); //false console.log(Number.isFinite(null)); //false console.log(Number.isFinite(true)); //false
3. Array.isArray
Array.isArray
方法用于判斷一個值是否為數(shù)組類型。
console.log(Array.isArray([])); //true console.log(Array.isArray([1, 2, 3])); //true console.log(Array.isArray({})); //false console.log(Array.isArray("hello world"));//false console.log(Array.isArray(undefined)); //false console.log(Array.isArray(null)); //false
4. Object.is
Object.is
方法用于比較兩個值是否相等,它比全局的===
運算符更加嚴(yán)格,可以判斷NaN
值和-0
和+0
的差別,使用Object.is
方法能夠更加準(zhǔn)確地比較兩個值是否相等。
console.log(Object.is(42, 42)); //true console.log(Object.is("hello world", "hello world"));//true console.log(Object.is(NaN, NaN)); //true console.log(Object.is(+0, -0)); //false console.log(Object.is('666', 666)); //false console.log(Object.is(true, 1)); //false console.log(Object.is(true, 'true')); //false
六、NaN 和 "== 、==="
在實際編寫JavaScript程序時,需要注意一些細(xì)節(jié)問題,以避免出現(xiàn)不必要的錯誤或者行為不符合預(yù)期的情況。以下是一些常見的問題和解決方法。
1. NaN
NaN
是Not A Number
的縮寫,NaN
不是一種數(shù)據(jù)類型,它屬于number
類型,NaN
是一個特殊的值,與任何值都不相等,包括它自己。因此,判斷一個值是否為NaN
需要使用isNaN()
函數(shù)。
2. ==(兩個等號)和 ===(三個等號)
在JavaScript中,==
和===
都是用來比較兩個值是否相等的運算符。它們的主要區(qū)別在于比較的嚴(yán)格程度和類型轉(zhuǎn)換的方式。==(相等運算符)
:在進(jìn)行比較時會進(jìn)行類型轉(zhuǎn)換,如果兩個值的類型不同,會將它們轉(zhuǎn)換為相同的類型再進(jìn)行比較。===(嚴(yán)格相等運算符)
:在進(jìn)行比較時不會進(jìn)行類型轉(zhuǎn)換,如果兩個值的類型不同,直接返回false。
console.log(1 == "1"); //true console.log(1 === "1"); //false console.log(0 == false); //true console.log(0 === false); //false console.log(null == undefined); //true, console.log(null === undefined);//false
因為null
和undefined
都是JavaScript
中的特殊值,使用==
時被認(rèn)為是相等的。
需要注意的是,由于==
會進(jìn)行類型轉(zhuǎn)換,因此可能會出現(xiàn)一些奇怪的結(jié)果。
console.log(null == 0); //false,null會被轉(zhuǎn)換為數(shù)字0 console.log(null < 1); //true,null會被轉(zhuǎn)換為數(shù)字0 console.log("5" == 5); //true,字符串"5"會被轉(zhuǎn)換為數(shù)字5 console.log(true == 1); //true,true會被轉(zhuǎn)換為數(shù)字1
需要注意,雖然null
會被轉(zhuǎn)成數(shù)字0
,但是null == 0
仍然輸出false
。 因此,在比較兩個值時,建議使用===
,這樣可以避免由于類型轉(zhuǎn)換等原因?qū)е碌腻e誤比較。
七、總結(jié)
本文介紹了JavaScript中常見的數(shù)據(jù)類型判斷方法,包括typeof操作符、instanceof操作符、Object.prototype.toString方法以及ES6新增的數(shù)據(jù)類型判斷方法。通過這些技術(shù),我們可以準(zhǔn)確地判斷數(shù)據(jù)類型,從而正確地處理數(shù)據(jù)。需要根據(jù)具體情況選擇合適的方法來判斷數(shù)據(jù)類型,以便于代碼的可讀性和可維護(hù)性。
以上就是詳解如何準(zhǔn)確判斷JavaScript中的數(shù)據(jù)類型的詳細(xì)內(nèi)容,更多關(guān)于判斷JavaScript數(shù)據(jù)類型的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mockjs,json-server一起搭建前端通用的數(shù)據(jù)模擬框架教程
下面小編就為大家分享一篇mockjs,json-server一起搭建前端通用的數(shù)據(jù)模擬框架教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12基于javascript數(shù)組實現(xiàn)圖片輪播
這篇文章主要為大家詳細(xì)介紹了基于javascript數(shù)組實現(xiàn)圖片輪播的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05適用于javascript開發(fā)者的Processing.js入門教程
這篇文章主要介紹了適用于javascript開發(fā)者的Processing.js入門教程,感興趣的小伙伴們可以參考一下2016-02-02基于JavaScript實現(xiàn)圖片點擊彈出窗口而不是保存
這篇文章主要介紹了基于JavaScript實現(xiàn)圖片點擊彈出窗口而不是保存的相關(guān)資料,需要的朋友可以參考下2016-02-02JS實現(xiàn)HTML頁面中動態(tài)顯示當(dāng)前時間完整示例
這篇文章主要介紹了JS實現(xiàn)HTML頁面中動態(tài)顯示當(dāng)前時間,結(jié)合完整實例形式分析了JavaScript使用時間函數(shù)setTimeout及clearTimeout動態(tài)顯示當(dāng)前時間相關(guān)操作技巧,非常簡單實用,需要的朋友可以參考下2018-07-07