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...