摘要:正文一基本類型檢測(cè)為什么說是基本類型檢測(cè)對(duì)于這三種類型經(jīng)常用到的基本類型檢測(cè)是正確的。為什么說是更好的檢測(cè)方法上面的兩種方法要么是只能檢測(cè)基本類型,要么是只能檢測(cè)引用類型,還存在不支持檢測(cè)的情況。
前言
前兩篇文章主要是一直在討論JS類型的轉(zhuǎn)換,那么怎么才能檢測(cè)JS的數(shù)據(jù)類型呢?
檢測(cè)數(shù)據(jù)類型在工程中經(jīng)常用到,常見的JS類型檢測(cè)有三種方法:
1. typeof 2. instanceof 3. Object.prototype.toString
那么在實(shí)際的操作中,我們應(yīng)該如何選擇使用呢?每種方法都是可以的嘛?這篇文章就帶哦你全面分析這三種類型檢測(cè)的方法,助你掌握J(rèn)S類型檢查的知識(shí)。
正文 一 ."typeof" 基本類型檢測(cè)1.為什么說typeof是基本類型檢測(cè)?
1)typeof對(duì)于string、number、boolean 這三種類型(經(jīng)常用到的基本類型)檢測(cè)是正確的。 2)對(duì)于undefined返回undefined 3)對(duì)于null返回object,null本身就是指空指針對(duì)象
2.如果用typeof檢查引用類型呢?
1)對(duì)于函數(shù)對(duì)象類型檢測(cè),會(huì)返回"function" 2)對(duì)于其他的對(duì)象進(jìn)行檢測(cè),返回"object"
3.應(yīng)該注意的地方
針對(duì)經(jīng)常出現(xiàn)的來說
1)null => object
2)Array => object
所以在確認(rèn)只可能返回string、number、boolean undefined 這四種類型的情況下,typeof檢測(cè)類型的方法是可以選的。
4. typeof 實(shí)現(xiàn)原理
js 在底層存儲(chǔ)變量的時(shí)候,會(huì)在變量的機(jī)器碼的低位1-3位存儲(chǔ)其類型信息:
000:對(duì)象 010:浮點(diǎn)數(shù) 100:字符串 110:布爾 1:整數(shù)
but, 對(duì)于 undefined 和 null 來說,這兩個(gè)值的信息存儲(chǔ)是有點(diǎn)特殊的。
null:所有機(jī)器碼均為0
undefined:用 ?2^30 整數(shù)來表示
所以,typeof 在判斷 null 的時(shí)候就出現(xiàn)問題了,由于 null 的所有機(jī)器碼均為0,因此直接被當(dāng)做了對(duì)象來看待。
1.首先要弄懂 instanceof的用法
下面內(nèi)容來自MDN對(duì)instanceof的解釋:
1)語法:首先左側(cè)是一個(gè)對(duì)象,例如 數(shù)組、函數(shù)、普通對(duì)象等;右側(cè)是一個(gè)構(gòu)造函數(shù),例如 Array Function Object
2)描述:這句話很重要--instanceof 檢測(cè)的是 constructor.proptotype 是否存在于 object的原型鏈上。
2. 下面是使用instanceof方法進(jìn)行JS類型檢測(cè)的內(nèi)容
從上圖中可以看出:
1)instanceof對(duì)于Object Array Function 這樣的引用類型檢測(cè)是完全沒有問題的
2)不支持基本類型的檢測(cè)
3)undefined null檢測(cè)都是不支持的
4)因?yàn)闄z測(cè)的是原型鏈,所以[ ] instanceof Object 這樣寬松的檢查也是返回true
3.總結(jié)
instanceof 完全適用于檢測(cè)Object Array Function 這樣的引用類型,不支持基本類型檢測(cè)。
4."instanceof" 檢測(cè)的局限性
工程中最常用的就是檢測(cè)數(shù)據(jù)是對(duì)象還是數(shù)組或者函數(shù),instanceof已經(jīng)足夠用了,但是有種情況下可能檢測(cè)不準(zhǔn)確,雖然這種情況在當(dāng)下大多數(shù)工程中不經(jīng)常出現(xiàn)。
我們可以利用Object原型上的toString方法來做更多的事情。
為什么說Object.prototype.toString 是更好的檢測(cè)方法?上面的兩種方法要么是只能檢測(cè)基本類型,要么是只能檢測(cè)引用類型,還存在undefined null不支持檢測(cè)的情況。有沒有一種萬能檢測(cè)的方法可以準(zhǔn)確的檢測(cè)呢?
看到上面的圖大家都笑了吧~ 看看Object.prototype.toString 的魔力有多大,大家放心的使用吧!
友情提示:
代碼中經(jīng)常這么用:
function getDataType(data){ const typeString = Object.prototype.toString.call(data); const type = typeString.slice(8); return type; }后記
現(xiàn)在檢測(cè)類型的方法有很多了,例如,用來檢測(cè)數(shù)組類型的Array.isArray()已經(jīng)很常用了。大家根據(jù)實(shí)際情況來進(jìn)行選擇使用吧~~ 如果你還想知道怎么判斷一個(gè)數(shù)組是類數(shù)組或者更多檢測(cè)類型的方法,建議看看underscorejs的實(shí)現(xiàn)方式。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/89464.html
摘要:在的項(xiàng)目中加入類型檢查。當(dāng)前項(xiàng)目是用寫的,當(dāng)項(xiàng)目越來越大,由于弱類型的特性,相比這種強(qiáng)類型的語言而言,后期維護(hù)會(huì)越來越困難。為了解決這個(gè)問題,決定使用加入類型檢查。一了解是公布的靜態(tài)類型檢查器。中配置配置,使其支持語法。 在vue2.0的項(xiàng)目中加入flow類型檢查。當(dāng)前項(xiàng)目是用js寫的,當(dāng)項(xiàng)目越來越大,由于js弱類型的特性,相比ts(typescript)這種強(qiáng)類型的語言而言,后期維護(hù)...
摘要:一是一種弱類型動(dòng)態(tài)類型檢查的語言。動(dòng)態(tài)類型與靜態(tài)類型的核心區(qū)別動(dòng)態(tài)類型的類型檢查是是在代碼運(yùn)行的時(shí)候進(jìn)行的,靜態(tài)類型的類型檢查則是在編譯時(shí)進(jìn)行。 一、js是一種弱類型、動(dòng)態(tài)類型檢查的語言。 弱類型:在定義變量時(shí),可以為變量定義復(fù)制任何數(shù)據(jù),變量的數(shù)據(jù)類型不是固定死的,這樣的類型叫做弱類型。 var a = 10; a = abc; a = []; a = function() {}...
摘要:一返回值調(diào)用外部方法獲取的值需要對(duì)類型做判斷,因?yàn)槲覀儗?duì)方法返回的值是有期望值類型,但是卻不能保證這個(gè)接口返回的值一直是同一個(gè)類型。 19年目標(biāo):消滅英語!我新開了一個(gè)公眾號(hào)記錄一個(gè)程序員學(xué)英語的歷程 有提升英語訴求的小伙伴可以關(guān)注公眾號(hào):csenglish 程序員學(xué)英語,每天花10分鐘交作業(yè),跟我一起學(xué)英語吧 javascript作為一門動(dòng)態(tài)類型語言,具有很高的動(dòng)態(tài)靈活性,當(dāng)定義函數(shù)...
摘要:一彈窗和輸出執(zhí)行順序是從上到下執(zhí)行控制瀏覽器彈出一個(gè)警告框讓計(jì)算機(jī)在頁面中輸出一個(gè)內(nèi)容在中寫一個(gè)內(nèi)容寫可以向中輸出一個(gè)內(nèi)容看我出不出來向控制臺(tái)輸出一個(gè)內(nèi)容作用是向控制臺(tái)輸出一個(gè)內(nèi)容你猜我在哪出來二編寫位置可以將代碼編寫到外部文件中,然后通過 一.彈窗和輸出 **javascript執(zhí)行順序是從上到下執(zhí)行** 1.控制瀏覽器彈出一個(gè)警告框 alert(HelloWord); 2.讓計(jì)...
閱讀 1458·2021-09-24 10:26
閱讀 3751·2021-09-06 15:02
閱讀 711·2019-08-30 14:18
閱讀 638·2019-08-30 12:44
閱讀 3169·2019-08-30 10:48
閱讀 2007·2019-08-29 13:09
閱讀 2059·2019-08-29 11:30
閱讀 2371·2019-08-26 13:36