在javascript中咱們一般使用typeof()
來檢測變量的類型,可是在一些複雜狀況下typeof()
就顯得力不從心了,下面咱們來講說typeof
,constructor
和toString
,使用這三個進行類型的檢測.javascript
typeof
檢測js中的基本類型仍是能夠的.java
var num = 1; typeof(num) // number var str = 'hello'; typeof(str); // string var bool = true; typeof(bool); // boolean
對於undefined
和null
就比較特殊了,數組
typeof(undefined); // undefined typeof(null); // object
對於函數、數組函數
function a(){}; typeof(a); // function var arr = []; typeof(arr); // object
對於下面的檢測就比較混亂了:this
typeof new Boolean(true) === 'object'; typeof new Number(1) ==== 'object'; typeof new String("abc") === 'object'; typeof new Date() === 'object';
該函數用來查看對象的構造函數prototype
var bool = true; console.log(bool.constructor == Boolean);// true var num = 1; console.log(num.constructor == Number); // true var str = 'hello'; console.log(str.constructor == String); // true
這裏須要注意的是:
對於 undefined
和 null
,不可以使用 construcor
檢測.code
使用toString
檢測,必須使用Object.prototype.toString()
,
先來看看這個東東輸出什麼鬼:對象
console.log(Object.prototype.toString()); // [object Object]
那麼如何使用toString()
來進行檢測呢?這裏使用 call()
來改變this
的指向,ip
var bool = true; console.log(Object.prototype.toString.call(bool)); // [object Boolean] var num = 1; console.log(Object.prototype.toString.call(num)); // [object Number] var str = 'hello'; console.log(Object.prototype.toString.call(str)); // [object String] var arr = []; console.log(Object.prototype.toString.call(arr)); // [object Array] var a = undefined; console.log(Object.prototype.toString.call(a)); // [object Undefined] var b = null; console.log(Object.prototype.toString.call(b)); // [object Null]
能夠看出 使用Object.prototype.toString.call()
來檢測 是比較完美的.推薦使用.原型鏈
檢測某個實例是否在某個對象的原型鏈上 原型鏈__proto__,
var c = []; console.log(c instanceof Object); //true var d = 123; // 這些 普通類型 並非對象 console.log(d instanceof Object); //false var str = 'hello'; // 不是對象 console.log(str instanceof Object); //false var num = new Number(123); console.log(num instanceof Object);