js中判斷資料型別的四種方法

前言

  在js中,我們經常需要判斷資料的型別,那麼哪些方法可以用來判斷資料的型別呢?哪種方法判斷資料型別最準確呢?

我們來一個個分析:

1.typeof

  typeof是一個運算子,使用方式有兩種:1.typeof(表示式)2.typeof 變數名。返回值為表示型別的字串。能判斷的型別有

  Number、String、Boolean,Undefined、Object、Function、Symbol等

  例項詳解:

  

注意最後兩個typeof null 和 typeof [] 返回的都是object。可以看出typeof並不能準確的判斷出array和null。

結論:

  typeof 對物件型別的值的型別不能作出準確判斷,能準確判斷出基本資料型別的值!

2.instanceof

  A instanceof B 判斷 A 是否為 B 的例項,如果是,則返回 true,不是則返回 false。instanceof檢測的是原型,內部機制其實就是判斷物件 A 的原型鏈中是否有 B 的原型。

  例項詳解:

從上面的例項我們可以看出,基本資料型別的值不能用 instanceof 判斷型別,由於undefined和null沒有建構函式,所以使用 instanceof 會報錯!而由基本資料包裝類建立的物件可以用 instanceof 判斷型別。

結論:

  instanceof 只能用於判斷物件,基本資料型別值不能判斷,所以也不能準確的判斷出所有的型別!

3.constructor

   當一個函式F被定義時,JS引擎會為F新增prototype原型,然後在prototype上新增一個constructor屬性,並讓其指向F的引用,F利用原型物件的constructor屬性引用了自身,當F作為建構函式建立物件時,原型上的constructor屬性被遺傳到了新建立的物件上,從原型鏈角度講,建構函式F就是新物件的型別。這樣做的意義是,讓物件誕生以後,就具有可追溯的資料型別。

  

從例項我們可以看出:constructor判斷undefined和null時,會報錯。

結論:

  constructor能判斷基本資料型別string、number、boolean和物件型別(array、function等等),但是它不能判斷undefined和null。所以它判斷型別值也不十分準確!

4.Object.prototype.toString.call()(最準確的判斷型別的方法,推薦使用,也是面試官想要的答案!!!)

  toString()是Object的原型方法,呼叫該方法,預設返回當前物件的[[Class]]。這是一個內部屬性,其格式為[object Xxx],其中Xxx就是物件的型別。

  對於Object物件,直接呼叫toString()就能返回[object Object],而對於其他物件,則需要通過call、apply來呼叫才能返回正確的型別資訊。

  

  從例項我們可以看出該方法能判斷基本型別也能判斷 Array 和 Function。

  對於Object物件:

  

  例項可見,對於Object物件,可以直接使用 toString() 方法,對於其他內建物件,Object.prototype.toString.call() 方法都能準確的判斷出其型別。

  結論:

    Object.prototype.toString.call() 方法是判斷型別的最準確的方法!

總結:

  要判斷一個值的型別,最準確的方法就是Object.prototype.toString.call()