美文网首页
typeof和instanceof的区别

typeof和instanceof的区别

作者: 路人丁0417 | 来源:发表于2022-01-06 11:21 被阅读0次

    参考 MDN

    typeof操作符返回一个字符串,表示字符串的类型
    语法:typeof operand 或者 typeof(operand)
    返回值: 字符串

    // number
    typeof 37 === 'number';
    typeof Math.LN2 === 'number';
    typeof Infinity === 'number';
    typeof NaN === 'number'; // 尽管它是 "Not-A-Number" (非数值) 的缩写
    typeof Number(1) === 'number'; // Number 会尝试把参数解析成数值
    
    // bigint
    typeof 42n === 'bigint';
    
    // string
    typeof '' === 'string';
    typeof 'bla' === 'string';
    typeof `template literal` === 'string';
    typeof '1' === 'string'; // 注意内容为数字的字符串仍是字符串
    typeof (typeof 1) === 'string'; // typeof 总是返回一个字符串
    typeof String(1) === 'string'; // String 将任意值转换为字符串,比 toString 更安全
    
    // boolean
    typeof true === 'boolean';
    typeof false === 'boolean';
    typeof Boolean(1) === 'boolean'; // Boolean() 会基于参数是真值还是虚值进行转换
    typeof !!(1) === 'boolean'; // 两次调用 ! (逻辑非) 操作符相当于 Boolean()
    
    // symbol
    typeof Symbol() === 'symbol';
    typeof Symbol('foo') === 'symbol';
    typeof Symbol.iterator === 'symbol';
    
    // undefined
    typeof undefined === 'undefined';
    typeof declaredButUndefinedVariable === 'undefined';
    typeof undeclaredVariable === 'undefined';
    
    // object
    typeof {a: 1} === 'object';
    
    // function
    typeof function() {} === 'function';
    typeof class C {} === 'function'
    typeof Math.sin === 'function';
    
    // null
    typeof null === 'object';
    
    

    总结:typeof 可以返回的字符串为:六种基础数据类型(string,number,boolean,undefined,symbol,bigint),两种引用类型(object,function)当后面跟宿主对象时,具体看宿主对象的实现方式

    instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
    语法:object instanceof constructor (object:某个实例对象, constructor:某个构造函数)

    // 定义构造函数
    function C(){}
    function D(){}
    
    var o = new C();
    o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
    
    o instanceof D; // false,因为 D.prototype 不在 o 的原型链上
    o instanceof Object; // true,因为 Object.prototype.isPrototypeOf(o) 返回 true
    C.prototype instanceof Object // true,同上
    
    C.prototype = {};
    var o2 = new C();
    
    o2 instanceof C; // true
    o instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上.
    
    D.prototype = new C(); // 继承
    var o3 = new D();
    o3 instanceof D; // true
    o3 instanceof C; // true 因为 C.prototype 现在在 o3 的原型链上
    
    

    注意: obj instanceof Foo 返回 true 并不意味永远返回true,因为Foo.prototype属性的值有可能会改变,obj的proto也有可能会改变
    当有多个全局环境的时候也有可能出现问题

    相关文章

      网友评论

          本文标题:typeof和instanceof的区别

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