1. typeof
2. instanceof
3. object.prototype.tostring
那麼在實際的操作中,我們應該如何選擇使用呢?每種方法都是可以的嘛?這篇文章就帶哦你全面分析這三種型別檢測的方法,助你掌握js型別檢查的知識。
1.為什麼說typeof是基本型別檢測?
1)typeof對於string、number、boolean 這三種型別(經常用到的基本型別)檢測是正確的。
2)對於undefined返回undefined
3)對於null返回object,null本身就是指空指標物件
2.如果用typeof檢查引用型別呢?
1)對於函式物件型別檢測,會返回'function'
2)對於其他的物件進行檢測,返回'object'
3.應該注意的地方針對經常出現的來說
1)null => object
2)array => object
所以在確認只可能返回string、number、boolean undefined 這四種型別的情況下,typeof檢測型別的方法是可以選的。
4. typeof 實現原理
js 在底層儲存變數的時候,會在變數的機器碼的低位1-3位儲存其型別資訊:
000:物件
010:浮點數
100:字串
110:布林
1:整數
but, 對於 undefined 和 null 來說,這兩個值的資訊儲存是有點特殊的。
null:所有機器碼均為0
undefined:用 −2^30 整數來表示
所以,typeof 在判斷 null 的時候就出現問題了,由於 null 的所有機器碼均為0,因此直接被當做了物件來看待。
1.首先要弄懂 instanceof的用法
下面內容來自mdn對instanceof的解釋:
1)語法:首先左側是乙個物件,例如 陣列、函式、普通物件等;右側是乙個建構函式,例如 array function object
2)描述:這句話很重要--instanceof 檢測的是constructor.proptotype是否存在於object的原型鏈上。
2. 下面是使用instanceof方法進行js型別檢測的內容
從上圖中可以看出:
1)instanceof對於object array function 這樣的引用型別檢測是完全沒有問題的
2)不支援基本型別的檢測
3)undefined null檢測都是不支援的
4)因為檢測的是原型鏈,所以[ ] instanceof object 這樣寬鬆的檢查也是返回true
3.總結
instanceof 完全適用於檢測object array function 這樣的引用型別,不支援基本型別檢測。
4.'instanceof' 檢測的侷限性
工程中最常用的就是檢測資料是物件還是陣列或者函式,instanceof已經足夠用了,但是有種情況下可能檢測不準確,雖然這種情況在當下大多數工程中不經常出現。
我們可以利用object原型上的tostring方法來做更多的事情。
為什麼說object.prototype.tostring 是更好的檢測方法?上面的兩種方法要麼是只能檢測基本型別,要麼是只能檢測引用型別,還存在undefined null不支援檢測的情況。有沒有一種萬能檢測的方法可以準確的檢測呢?
看到上面的圖大家都笑了吧~ 看看object.prototype.tostring 的魔力有多大,大家放心的使用吧!
**中經常這麼用:
function getdatatype(data)
現在檢測型別的方法有很多了,例如,用來檢測陣列型別的array.isarray()已經很常用了。大家根據實際情況來進行選擇使用吧~~ 如果你還想知道怎麼判斷乙個陣列是類陣列或者更多檢測型別的方法,建議看看underscorejs的實現方式。 js檢查資料型別的方法
console.log typeof string console.log typeof 1 number console.log typeof true boolean console.log typeof undefined undefined console.log typeof null o...
js型別轉換
js varscolor blue alert scolor.length outputs 4 js varbfound false alert bfound.tostring outputs false js varinum1 10 varfnum2 10.0 alert fnum2.tostri...
js 型別轉換
function str function tostr val function todstr val,dv function trim str function lenb str function ismobile str d 13 d 15 d if reg.test trim str retu...