typeof与instanceof

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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容