美文网首页饥人谷技术博客
类型识别的几种方法

类型识别的几种方法

作者: YM雨蒙 | 来源:发表于2017-08-28 14:18 被阅读25次

    类型识别方法

    • typeof
    • instanceof
    • Object.prototype.toString.call
    • constructor

    typeof操作符

    • 可以识别标准类型(Null除外)
    typeof 'yym'  //"string"
    typeof 23  //"number"
    typeof true  //"boolean"
    typeof undefined  //"undefined"
    typeof null  //"object"    没有识别的正确
    typeof {name:'yym'}  //"object"
    
    标准类型识别
    • 不能识别具体的对象类型(Function除外)
    typeof function(){}  //"function"  这个识别是function
    typeof []  //"object"
    typeof new Date  //"object"
    typeof /\d/  //"object"
    
    function Person(){}
    typeof new Person  //"object"
    
    具体对象类型

    instanceof

    • 能够判别内置对象类型
    • 不能判别原始类型
    • 能够判别自定义对象类型和父子类型
      • 识别所有的对象类型
    能够判别内置对象类型
    [] instanceof Array  //true
    /\d/ instanceof RegExp  //true
    new Date instanceof Date  //true
    
    不能判别原始类型
    1 instanceof Number  //false
    'yym' instanceof String  //false
    

    Object.prototype.toString.call方法

    • 可以识别标准类型以及内置对象类型
    • 不能识别自定义对象类型
    Object.prototype.toString.call(123)  //"[object Number]"
    Object.prototype.toString.call('yym')  //"[object String]"
    Object.prototype.toString.call(true)  //"[object Boolean]"
    

    从上面的代码中我们可以看到返回值是一个字符串当中的子字符串,我们来封装一个方法

    function type(obj){
      return Object.prototype.toString.call(obj).slice(8, -1)
    }
    type(1)  //"Number"
    type('1')  //"String"
    type(true)  //"Boolean"
    type(undefined)  //"Undefined"
    type(null)  //"Null"
    

    constructor 构造函数

    • 判别标准类型(Undefined/Null除外)
    • 判别内置对象类型
    • 判别自定义对象类型
    判别标准类型(Undefined/Null除外)
    'yym'.constructor === String  //true
    (1).constructor === Number  //true
    true.constructor === Boolean  //true
    ({}).constructor === Object  //true
    
    判别内置对象类型
    new Date().constructor === Date  //true
    [].constructor === Array  //true
    

    封装一下获取构造函数的名称

    /*
    * 1. 入参obj如果是undefined和null,则返回其自身;
    * 2. 入参obj如果是其他值,则返回obj.constructor&&obj.constructor.toString().match(/function\s*([^(]*)/)[1]的结果;
    */
    function getConstructorName(obj){
        return (obj===undefined||obj===null)?obj:(obj.constructor&&obj.constructor.toString().match(/function\s*([^(]*)/)[1]);
    }
    

    看一个类型识别的题目

    /*
    * 输入格式:
    * '2015-08-05'
    * 1438744815232
    * {y:2015,m:8,d:5}
    * [2015,8,5]
    * 返回格式:Date
    */
    function toDate(param){
      if (typeof(param) == 'string' || 
          typeof(param) == 'number' ){
        return new Date(param);
      } 
      if (param instanceof Array){
        var date = new Date(0);
        date.setYear(param[0]);
        date.setMonth(param[1]-1);
        date.setDate(param[2]);
        return date;
      }
      if (typeof(param) == 'object') {
        var date = new Date(0);
        date.setYear(param.y);
        date.setMonth(param.m-1);
        date.setDate(param.d);
        return date;
      }
      return -1;
    }
    
    

    相关文章

      网友评论

        本文标题:类型识别的几种方法

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