美文网首页
typeof与instanceof

typeof与instanceof

作者: 青色河马 | 来源:发表于2016-12-01 13:58 被阅读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都是用来判断变量类型的,两者的区别在于:

    • typeof判断所有变量的类型,返回值有number,boolean,string,function,object,undefined
    • typeof对于丰富的对象实例,只能返回"Object"字符串。
    • instanceof用来判断对象,代码形式为obj1 instanceof obj2(obj1是否是obj2的实例),obj2必须为对象,否则会报错!其返回值为布尔值
    • instanceof可以对不同的对象实例进行判断,判断方法是根据对象的原型链依次向下查询,如果obj2的原型属性存在obj1的原型链上,(obj1 instanceof obj2)值为true。

    相关文章

      网友评论

          本文标题:typeof与instanceof

          本文链接:https://www.haomeiwen.com/subject/ndmxmttx.html