在JavaScript中,如何判斷數據類型(類型檢測)

javascript的數據類型能夠分爲兩大類:原始類型和引用類型. 原始類型(基本數據類型)包括Undefined、Null、Boolean、Number和String五種,而引用類型也稱爲複雜類型,在Javascript中是Object。與此相對應,它們的值也分別被稱爲原始值和複雜值.javascript


在不少地方咱們須要進行類型檢測, 通常的檢測方法有如下幾種:java

經過typeof 操做符判斷web

typeof   2               //   number
typeof   null            //   object
typeof   {}              //   object
typeof    []             //   object
typeof    undefined      //   undefined
typeof   '222’           //   string
typeof  true             //   boolean

可是在使用 typeof 檢測引用類型存儲值會出現一個問題,不管引用的是什麼類型的對象,它都返回 "object"。而且null也不符合常規, 它是基本類型,可是typeof出來是object. 能夠理解成是obj的佔位符. 函數

經過下面三種方法能夠解決剛纔的問題.prototype


經過Object.prototype.toString方法判斷 code

這是對象的一個原生原型擴展函數,能夠用來更精確的區分數據類型。能夠自行封裝一下方便使用.對象

var gettype=Object.prototype.toString
gettype.call('aaaa')        //  [object String]

經過 constructor 屬性判斷繼承

全部實例對象都有constructor屬性,constructor屬性指向prototype對象所在的構造函數,就是說指向建立這個實例的構造函數。ip

''.constructor==String    
 [].constructor==Array
var obj= new Object() 
obj.constructor==Object

經過instanceof操做符判斷原型鏈

instanceof 運算符與 typeof 運算符類似,用於識別正在處理的對象的類型。與 typeof 方法不一樣的是,instanceof 方法要求開發者明確地確認對象爲某特定類型。
obj instanceof Object,左邊操做數obj爲待檢測對象(若是不當心寫成基本類型 好比數字原始值,就會返回false. ),右邊操做數Object爲函數對象或者是函數構造器,不然拋出TypeError.

常規用法:

var a = new String("hello world");
console.log(a instanceof String);   // "true"

更重要的應用是 instanceof 能夠在繼承關係中用來判斷一個實例是否屬於它的父類型。例如:

// 判斷 foo 是不是 Foo 類的實例 , 而且是不是其父類型的實例
function Aoo(){}
function Foo(){}
Foo.prototype = new Aoo();//JavaScript 原型繼承
 
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true

實質就是:instanceof操做符判斷左操做數對象的原型鏈上是否有右邊這個構造函數的prototype屬性,也就是說指定對象是不是某個構造函數的實例,最後返回布爾值,這個對整個原型鏈上的對象都是有效的,因爲instanceof對整個原型鏈上的對象都有效,所以同一個實例對象,可能會對多個構造函數都返回true.

PS: instanceof 運算符是從Java 中引入的. 其檢測原理是js基於原型鏈的繼承關係. 更多信息請參考https://www.ibm.com/developer...

相關文章
相關標籤/搜索