typeof
typeof是判断变量类型,它的返回值值为字符串,分别有6个值:number,boolean,string,function,object,undefined。
一般我们使用typeof来判断变量是否存在,并进行代码操作:
if(typeof a == undefined) console.log('N');
有人有时会用if(a)来判断变量是否存在,但是这是不严谨的,因为变量值为null与undefined的状态是一样的,这样就无法排除null
缺点:
对于 Array,null ,函数实例等特殊对象使用 typeof 一律返回 object,对于object,无法做进一步判断;
function parent(){
console.log('parent')
}
function child(){
console.log('child')
}
var f1=new parent;
var f2=new child;
console.log(typeof f1)//object
console.log(typeof f2)//object
console.log(f1==parent);//false
而此时instanceof的出现正好妳补了这一局限性。
instanceof
instance中文翻译为实例,因此instanceof的含义就不言而喻,判断该对象是谁的实例,同时我们也就知道instanceof是对象运算符。
这里的实例就牵扯到了对象的继承,它的判断就是根据原型链进行搜寻,在对象obj1的原型链上如果存在另一个对象obj2的原型属性,那么表达式(obj1 instanceof obj2)返回值为true;否则返回false。
例如:
function foo() {
}
function foo1() {
}
foo.prototype = new foo1();
var f = new foo;
console.log(f instanceof foo1); // true
console.log(f instanceof foo); // true
console.log(f instanceof Object); // true
console.log(f instanceof Array); // false
因为foo函数和foo1函数都存在对象f的原型链上,即对象f的原型链:f.__proto==>foo.prototype(foo1)==>foo1.prototype==>Object,而对象Array不存在对象f的原型链上,所以输出结果如上。
所以我们可以使用instanceof来解决typeof的局限性。因为Array,null 等特殊对象使用 typeof 一律返回 object,无法进一步判断,此时使用instanceof可以进一步对object进行判断,判断是否是Array或某个函数的实例,这样对于条件判断的使用就更灵活了,现在我们附上一段代码,就看的更明确了。
function parent(){
}
function child(){
}
var f1=new parent;
var f2=new child;
console.log(typeof f1)//object
console.log(typeof f2)//object
console.log(f1==parent);//false
console.log(f1 instanceof parent);//true
console.log(f1 instanceof child);//false
console.log(f2 instanceof child);//true
总结:
想必到这里大家也都明白两者的含义和用法,总之,typeof和instanceof都是用来判断变量类型的,两者的区别在于:
- typeof判断所有变量的类型,返回值有number,boolean,string,function,object,undefined。
- typeof对于丰富的对象实例,只能返回"Object"字符串。
- instanceof用来判断对象,代码形式为obj1 instanceof obj2(obj1是否是obj2的实例),obj2必须为对象,否则会报错!其返回值为布尔值。
- instanceof可以对不同的对象实例进行判断,判断方法是根据对象的原型链依次向下查询,如果obj2的原型属性存在obj1的原型链上,(obj1 instanceof obj2)值为true。