obj instanceof Object(obj:必须是对象,如果是基本类型,直接会返回false; Object:必须是函数对象,或者函数构造器,如果不是,就会抛出TypeError异常。)
看下简单的例子
new Object() instanceof Array === false //true [1, 2] instanceof Array === true //true [] instanceof Array===true//true
我们知道,任何一个构造函数,都有一个prototype对象属性,这个对象属性将用作使用new构造函数这种方式构造出的对象的原型。比如Person这个函数,函数有prototype属性. 我们用new Person()去创建Person实例的时候,这个对象实例就会有一个原型指向Person.prototype这个对象。我们用var bosn=new Student(),创建一个Student实例bosn,bosn的原型会指向它的构造器Student的prototype对象属性。检测bosn instanceof Person时,bosn.__proto__=Student.prototype,然后原型链会继续往上查找,bosn.__proto__.__proto__=person.prototype.就会返回true。注意,不同window或iframe间的对象类型检测不能使用instanceof!
3,Object.prototype.toString()判断类型,适合内置对象和基本类型,遇到null和undefined失效,IE6/IE7/IE8返回'[object Object]'
Object.prototype.toString.apply([]);==='[object Array]'; Object.prototype.toString.apply(function(){});==='[object Function]'; Object.prototype.toString.apply(null);==='[object Null]';//IE6/IE7/IE8返回'[object Object]' Object.prototype.toString.apply(undefined);==='[object Undefined]';//IE6/IE7/IE8返回'[object Object]' Object.prototype.toString.apply('123');==="[object String]"; Object.prototype.toString.apply(123);==="[object Number]"; Object.prototype.toString.apply(true);==="[object Boolean]"; Object.prototype.toString.apply(String);==="[object Function]"; Object.prototype.toString.apply(Boolean);==="[object Function]"
4,constructor检测类型
任何一个对象都有一个constructor属性,继承自原型,会执向构造这个对象的构造函数, constructor可以被改写,使用时要小心。
5,duck type检测类型
比如我们不知道一个对象是否是数组,我们可以判断这个对象的length是否是数字,是否有join,push等数组的函数方法,通过特征判断对象是否属于某些类型,有时也会用到。