typeof与instanceof

2016-12-01  本文已影响0人  青色河马

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都是用来判断变量类型的,两者的区别在于:

上一篇下一篇

猜你喜欢

热点阅读