JS中準(zhǔn)確判斷變量類型的方法
這是一個(gè)高頻面試題,我們開發(fā)中也進(jìn)程會(huì)遇到,今天我們來實(shí)現(xiàn)一個(gè)函數(shù)getValType(val)
用來獲取一個(gè)變量的類型。從1. JS基礎(chǔ)變量類型。2. Js中判斷變量的函數(shù)。 3. 實(shí)現(xiàn)getValType函數(shù)。3個(gè)方面來分析實(shí)現(xiàn)。
Js基礎(chǔ)變量類型
在 JS
中,有 5 種基本數(shù)據(jù)類型和 1 種復(fù)雜數(shù)據(jù)類型,基本數(shù)據(jù)類型有:Undefined, Null, Boolean, Number
和String
;復(fù)雜數(shù)據(jù)類型是Object
,Object
中還細(xì)分了很多具體的類型,比如:Array, Function, Date
等等。
判斷變量的函數(shù)
我們先定義一組變量來用下面的函數(shù)來測(cè)試:
var allVarMap = { // 數(shù)字 num:123, // Infinity num1: 1 / 0, // NaN num2: null / 0, // 字符串 str: 'abcdef', // 布爾類型 bool: true, // 數(shù)組 arr :[1, 2, 3, 4], // json對(duì)象 json :{name:'wenzi', age:25}, // 函數(shù) func:function(){ console.log('this is function'); }, // 箭頭函數(shù) func1: () => {console.log('arrow function')}, // undefined類型 und:undefined, // null類型 nul:null, // date類型 date:new Date(), // 正則表達(dá)式 reg :/^[a-zA-Z]{5,20}$/, // 異常類型 error:new Error() }
typeof判斷變量類型
typeof
運(yùn)算符用于判斷對(duì)象的類型,但是對(duì)于一些創(chuàng)建的對(duì)象,它們都會(huì)返回object
。我們用該函數(shù)來判斷上面的結(jié)果:
var results = [] for (let i in allVarMap) { results.push(typeof allVarMap[i]) } console.log(results.join()) // number,number,number,string,boolean,object,object,function,function,undefined,object,object,object,object
可以看到,NaN
和Infinity
都檢查為number
類型,其他的 string,function,boolean,undefined
包括箭頭函數(shù)都能正確檢查出來,但是對(duì)于reg,date,null
都得到了object
??磥磉€需要具體的判斷。
instanceof檢查
ECMAScript
引入了另一個(gè) Java
運(yùn)算符 instanceof
來解決這個(gè)問題。instanceof
運(yùn)算符與typeof
運(yùn)算符相似,用于識(shí)別正在處理的對(duì)象的類型。instanceof
運(yùn)算符用來判斷一個(gè)構(gòu)造函數(shù)的prototype
屬性所指向的對(duì)象是否存在另外一個(gè)要檢測(cè)對(duì)象的原型鏈上。與 typeof
方法不同的是,instanceof
方法要求開發(fā)者明確地確認(rèn)對(duì)象為某特定類型。
console.log(allVarMap.date instanceof Date) // true console.log(allVarMap.func instanceof Function) // true
可以看到instanceof
可以正確判斷出date,func
的類型,但是前提是已知該變量的類型,所以這里不符合我們的預(yù)期。
使用Object.prototype.toString.call
定義:首先,取得對(duì)象的一個(gè)內(nèi)部屬性[[Class]],然后依據(jù)這個(gè)屬性,返回一個(gè)類似于”[object Array]“的字符串作為結(jié)果(看過ECMA標(biāo)準(zhǔn)的應(yīng)該都知道,[[]]用來表示語言內(nèi)部用到的、外部不可直接訪問的屬性,稱為“內(nèi)部屬性”)。利用這個(gè)方法,再配合call,我們可以取得任何對(duì)象的內(nèi)部屬性[[Class]],然后把類型檢測(cè)轉(zhuǎn)化為字符串比較,以達(dá)到我們的目的。
我們看看下面的函數(shù)運(yùn)行結(jié)果:
var results = [] for (let i in allVarMap) { results.push(Object.prototype.toString.call(allVarMap[i])) } console.log(results.join()) // [object Number],[object Number],[object Number],[object String],[object Boolean],[object Array],[object Object],[object Function],[object Function],[object Undefined],[object Null],[object Date],[object RegExp],[object Error]
實(shí)現(xiàn)getValType函數(shù)
根據(jù)上面的分析,我們可以先用typeOf函數(shù)判斷出基礎(chǔ)類型number,string,function,boolean,undefined。然后如果結(jié)果是object,我們?cè)儆肙bject.prototype.toString.call來判斷出具體的類型。
var getVarType = function (val = 0) { var type = typeof val // object需要使用Object.prototype.toString.call判斷 if (type === 'object') { var typeStr = Object.prototype.toString.call(val) // 解析[object String] typeStr = typeStr.split(' ')[1] type = typeStr.substring(0, typeStr.length - 1) } return type } var results = [] for (let i in allVarMap) { results.push(getVarType(allVarMap[i])) } console.log(results.join()) // number,number,number,string,boolean,Array,Object,function,function,number,Null,Date,RegExp,Error
可以看到,完美判斷出了所有變量的類型,該函數(shù)可以再添加一些邏輯,判斷一個(gè)變量是否是NaN,Infinity
之類的特殊需求。
總結(jié)
1 typeOf
能判斷出一個(gè)變量的類型,但是只能判斷出number,string,function,boolean,undefined,null
和其他對(duì)象類型返回結(jié)果都為object
.
2 instanceof
能判斷出一個(gè)對(duì)象是否是另一個(gè)類的實(shí)例。
3 Object.prototype.toString.call
能判斷出所有變量的類型,返回值為[Object ***]
。
以上就是一文看懂在JS中準(zhǔn)備判斷變量類型的詳細(xì)內(nèi)容,更多關(guān)于JS判斷變量類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
推薦幾個(gè)不錯(cuò)的console調(diào)試技巧實(shí)現(xiàn)
這篇文章主要介紹了推薦幾個(gè)不錯(cuò)的console調(diào)試技巧實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12bootstrap模態(tài)框遠(yuǎn)程示例代碼分享
這篇文章主要為大家詳細(xì)介紹了bootstrap模態(tài)框遠(yuǎn)程示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05js 實(shí)現(xiàn)的可折疊留言板(附源碼下載)
留言板想必大家都有見過吧,但是可以折疊的卻不是很多,恰好本文提供一個(gè)比較不錯(cuò)的可折疊留言板,感興趣的朋友可以學(xué)習(xí)下2014-07-07一個(gè)不錯(cuò)的字符串轉(zhuǎn)碼解碼函數(shù)(自寫)
一個(gè)不錯(cuò)的字符串轉(zhuǎn)碼解碼函數(shù),自己寫的,有需要的朋友可以參考下2014-07-07微信小程序?qū)崿F(xiàn)流程進(jìn)度的圖樣式功能
最近正在做微信小程序,需要實(shí)現(xiàn)一個(gè)流程進(jìn)度的圖樣式,下面小編給大家?guī)砹宋⑿判〕绦驅(qū)崿F(xiàn)流程進(jìn)度的圖樣式功能實(shí)例代碼,需要的朋友參考下吧2018-01-01微信小程序調(diào)用后臺(tái)service教程詳解
這篇文章主要介紹了微信小程序調(diào)用后臺(tái)service教程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11