整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaScript搞定數據類型檢測的三種方法

          Js的數據類型檢測在實際開發項目過程中會經常遇到,這里邊存在很多坑,比如我們初學Js的時候可能只知道判斷數據類型一個typeof就萬事大吉了,其實還有一個,你以為的這兩種就夠用了嗎?就能準確判斷每種數據類型了嗎?不會,還有很多坑等著你去跳,今天我們就把這些坑都刨出來給大家看,一起完美避坑!

          數據類型種類_js中有哪幾種數據類型_類型數據有哪些

          1. 通過typeof檢測

          這是我們比較常用的一種類型檢測方法,通過一段代碼回顧下:

          typeof 1            // number
          typeof '1'          // string
          typeof undefined    // undefined
          typeof true         // boolean
          typeof Symbol()     // symbol
          typeof null         // object
          typeof []           // object
          typeof {}           // object
          typeof console      // object
          typeof console.log  // function

          通過以上代碼可以看出,typeof在判斷null之前幾個基本數據類型的時候基本上是準確無誤的,可是在判斷null時返回的是引用類型(object),這明顯是有問題,null壓根就不是引用類型,這是Js本身的一個bug,還有在判斷數組類型、對象以及引用類型上都返回的是object,所以這也是有問題的,只有在判斷類型時是正確的!

          以上這些坑在實際開發過程中應盡量避免!

          2. 通過檢測

          想必 的方法你也聽說過,我們 new 一個對象,那么這個新對象就是它原型鏈繼承上面的對象了,通過 我們能判斷這個對象是否是之前那個構造函數生成的對象,這樣就基本可以判斷出這個新對象的數據類型。下面通過代碼來了解一下。

          let Car = function() {}
          let benz = new Car()
          benz instanceof Car // true
          let car = new String('Mercedes Benz')
          car instanceof String // true
          
          let str = 'Covid-19'
          str instanceof String // false

          那么typeof與之間有什么差異呢?

          可以準確地判斷復雜引用數據類型,但是不能正確判斷基礎數據類型;而 typeof 也存在弊端,它雖然可以判斷基礎數據類型(null 除外),但是引用數據類型中,除了 類型以外,其他的也無法判斷。

          總之,不管單獨用 typeof 還是 ,都不能滿足所有場景的需求,而只能通過二者混寫的方式來判斷。但是,即使采用兩種混寫的方式,也只能檢測大多數情況,并且寫起來也相當難受!

          所以,在實際開發中,推薦采用第三種判斷方法!

          3. 通過Object..檢測

          () 是 Object 的原型方法,調用該方法,可以統一返回格式為 “[object Xxx]” 的字符串,其中 Xxx 就是對象的類型。對于 Object 對象,直接調用 () 就能返回 [object Object];而對于其他對象,則需要通過 call 來調用,才能返回正確的類型信息。我們來看一下代碼。

          Object.prototype.toString({})       // "[object Object]"
          Object.prototype.toString.call({})  // 同上結果,加上call也ok
          Object.prototype.toString.call(1)    // "[object Number]"
          Object.prototype.toString.call('1')  // "[object String]"
          Object.prototype.toString.call(true)  // "[object Boolean]"
          Object.prototype.toString.call(function(){})  // "[object Function]"
          Object.prototype.toString.call(null)   //"[object Null]"
          Object.prototype.toString.call(undefined) //"[object Undefined]"
          Object.prototype.toString.call(/123/g)    //"[object RegExp]"
          Object.prototype.toString.call(new Date()) //"[object Date]"
          Object.prototype.toString.call([])       //"[object Array]"
          Object.prototype.toString.call(document)  //"[object HTMLDocument]"
          Object.prototype.toString.call(window)   //"[object Window]"

          從上面這段代碼可以看出,Object...call() 可以很好地判斷引用類型,甚至可以把 和 window 都區分開來。

          js中有哪幾種數據類型_數據類型種類_類型數據有哪些

          但是在寫判斷條件的時候一定要注意,使用這個方法最后返回統一字符串格式為 "[object Xxx]" ,而這里字符串里面的 "Xxx" ,第一個首字母要大寫(注意:使用 typeof 返回的是小寫),這里需要多加留意。

          那么下面來實現一個全局通用的數據類型判斷方法,來加深理解,代碼如下。

          function getType(obj){
            let type  = typeof obj;
            if (type !== "object") {    // 先進行typeof判斷,如果是基礎數據類型,直接返回
              return type;
            }
            // 對于typeof返回結果是object的,再進行如下的判斷,正則返回結果
            return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');  // 注意正則中間有個空格
          }
          /* 代碼驗證,需要注意大小寫,哪些是typeof判斷,哪些是toString判斷?思考下 */
          getType([])     // "Array" typeof []是object,因此toString返回
          getType('123')  // "string" typeof 直接返回
          getType(window) // "Window" toString返回
          getType(null)   // "Null"首字母大寫,typeof null是object,需toString來判斷
          getType(undefined)   // "undefined" typeof 直接返回
          getType()            // "undefined" typeof 直接返回
          getType(function(){}) // "function" typeof能判斷,因此首字母小寫
          getType(/123/g)      //"RegExp" toString返回

          以上就是Js中檢測數據的三種方法,最后實現了一個通用類檢測方法,基本上可以搞定所有數據類型的檢測,每一種方法都有自己的強項和不足,我們在使用過程中,還是要看業務場景具體選擇!


          主站蜘蛛池模板: 精品一区二区三区在线视频| 一区二区三区日韩| 成人区人妻精品一区二区不卡| 人妻天天爽夜夜爽一区二区| 精品一区二区三区在线观看视频| 性色av一区二区三区夜夜嗨| 中文字幕一区二区三区久久网站| 亚洲AV成人精品日韩一区| 激情久久av一区av二区av三区| 日本中文一区二区三区亚洲| 夜夜嗨AV一区二区三区| 91在线视频一区| 视频在线观看一区二区| 亚洲无线码一区二区三区| 无码一区二区三区爆白浆| 无码人妻一区二区三区免费视频| 国产伦精品一区二区免费 | 一区二区三区在线|欧| 韩国精品一区二区三区无码视频| 爆乳熟妇一区二区三区霸乳 | 亚洲区精品久久一区二区三区| 无码人妻一区二区三区av| 丝袜人妻一区二区三区| 极品尤物一区二区三区| 国产色精品vr一区区三区| 亚洲一区二区影视| 国产亚洲自拍一区| 四虎在线观看一区二区| 午夜福利一区二区三区高清视频| 国产乱码精品一区二区三区香蕉 | 国产一区二区在线观看视频| 国产成人一区二区三区在线| 亚洲欧美日韩一区二区三区在线 | 亚洲第一区视频在线观看| 日韩精品无码人妻一区二区三区 | 亚洲国产成人久久综合一区77| 精品少妇ay一区二区三区| 国产在线观看一区精品| 在线一区二区三区| 中文字幕日韩一区二区三区不卡| 亚洲一区二区三区免费|