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