整合營銷服務商

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

          免費咨詢熱線:

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


          主站蜘蛛池模板: 国产乱人伦精品一区二区在线观看| 国产自产V一区二区三区C| 亚洲一区二区三区自拍公司| 中文人妻av高清一区二区| 一区二区三区午夜视频| 久久精品国产亚洲一区二区| 日韩视频一区二区| 海角国精产品一区一区三区糖心 | 在线精品自拍亚洲第一区| 亚洲精品一区二区三区四区乱码| 熟妇人妻一区二区三区四区| 亚洲av午夜精品一区二区三区 | 国产对白精品刺激一区二区| 看电影来5566一区.二区| 久久一区二区免费播放| 99国产精品一区二区| 国产一区三区二区中文在线| 国产精品无码一区二区在线观一| 一区二区三区美女视频| 欲色影视天天一区二区三区色香欲| 福利一区二区视频| 国产精品亚洲不卡一区二区三区| 亚洲AV永久无码精品一区二区国产| 亚洲国产专区一区| 国产成人无码一区二区三区在线 | 天堂不卡一区二区视频在线观看| 国产丝袜一区二区三区在线观看| 日韩精品一区在线| 一区在线免费观看| 久久精品国产一区| 亚洲乱色熟女一区二区三区蜜臀| 亚洲欧美日韩国产精品一区| 极品少妇一区二区三区四区| 日韩动漫av在线播放一区| 三上悠亚亚洲一区高清| 乱精品一区字幕二区| 成人在线观看一区| 日韩精品无码一区二区三区四区 | 无码国产精品一区二区免费I6| 中文乱码字幕高清一区二区| 国产成人av一区二区三区在线|