typeof操做符是检测基本类型的最佳工具。数组
"undefined" — 未定义 typeof unddfined
"boolean" — 布尔值 typeof boolean
"string" — 字符串 typeof string
"number" — 数值 typeof unddfined number
"object" — 对象或null typeof object/null
"function" — 函数 typeof function
复制代码
instanceof用于检测引用类型,能够检测到它是什么类型的实例。
instanceof 检测一个对象A是否是另外一个对象B的实例的原理是:查看对象B的prototype指向的对象是否在对象A的[[prototype]]链上。若是在,则返回true,若是不在则返回false。不过有一个特殊的状况,当对象B的prototype为null将会报错(相似于空指针异常).bash
var sXzaver = new String("Xzavier");
console.log(sXzaver instanceof String); // "true"
var aXzaver = [1,2,3];
console.log(aXzaver instanceof Array); // "true"
检测数组在ECMA Script5中定义了一个新方法Array.isArray()
复制代码
constructor属性返回对建立此对象的数组函数的引用。能够用于检测自定义类型函数
'xz'.constructor == String // true
(123).constructor == Number // true
(true).constructor == Boolean // true
[1,2].constructor == Array // true
({name:'xz'}).constructor == Object // true
(function(){}).constructor == Function // true
(new Date()).constructor == Date // true
(Symbol()).constructor == Symbol // true
(/xz/).constructor == RegExp // true
复制代码
constructor不适用于null和undefined。除了这些原生的,constructor还可验证自定义类型。工具
function Xzavier(){}
var xz = new Xzavier();
xz.constructor == Xzavier; // true
复制代码
推荐使用:Object.prototype.toString.call(obj)ui
原理:调用从Object继承来的原始的toString()方法
Object.prototype.toString.call('xz'); //"[object String]"
Object.prototype.toString.call(123); //"[object Number]"
Object.prototype.toString.call(true); //"[object Boolean]"
Object.prototype.toString.call([1,2]); //"[object Array]"
Object.prototype.toString.call({name:'xz'}); //"[object Object]"
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(); //"[object Undefined]"
Object.prototype.toString.call(new Date()); //"[object Date]"
Object.prototype.toString.call(/xz/); //"[object RegExp]"
Object.prototype.toString.call(Symbol()); //"[object Symbol]"
var obj = {name:"Xzavier", age:23};
var a = [1,2,3];
function isType(obj) {
return Object.prototype.toString.call(obj).slice(8, -1);
}
isType(obj); // "Object"
isType(a) // "Array"
复制代码