数据类型判断(https://github.com/mqyqingfeng/Blog/issues/28)


  • React高级班

      本文摘自冴羽的git,标题附上git地址。(每次看见大神写得东西都恶补基础。。。)
      大家都知道,es6之前javascript一共有6种数据类型,null,boolean,string,object,undefined,number,当我们使用typeof来查看数据类型时,除了typeof null返回的是'object',其他都返回自己本身。(因为null====null为true,我们判断null时判断是否===null,而undefined由于void的特性,undefined===void 0)
     我们知道,函数在javascript中是一等公民,javascript中是没有类的,使用prototype原型链来模拟类的特性,所以,当我们typeof Data,typeof RegExp等等是数据类型为'function',而当我们let a = new Date();typeof a 时数据类型为'obeject',同理,new出来的RegExp的数据类型也为'object'。
      Es5针对这个问题出来一个一个Obeject.prototype.toString方法,为了更加细致的讲解这个函数,让我先献上 ES5 规范地址:https://es5.github.io/#x15.2.4.2。
      When the toString method is called, the following steps are taken:
      1.If the this value is undefined, return "[object Undefined]".
      2.If the this value is null, return "[object Null]".
      3.Let O be the result of calling ToObject passing the this value as the argument.
      4.Let class be the value of the [[Class]] internal property of O.
      5.Return the String value that is the result of concatenating the three Strings "[object ", class, and "]".
     当 toString 方法被调用的时候,下面的步骤会被执行:
     1.如果 this 值是 undefined,就返回 [object Undefined]
     2.如果 this 的值是 null,就返回 [object Null]
     3.让 O 成为 ToObject(this) 的结果
     4.让 class 成为 O 的内部属性 [[Class]] 的值
     5.最后返回由 "[object " 和 class 和 "]" 三个部分组成的字符串
     通过规范,我们至少知道了调用 Object.prototype.toString 会返回一个由 "[object " 和 class 和 "]" 组成的字符串,而 class 是要判断的对象的内部属性。
     正是因为这种特性,我们可以用 Object.prototype.toString 方法识别出更多类型!那到底能识别多少种类型呢?至少 12 种:
     var number = 1;          // [object Number]
     var string = '123';      // [object String]
     var boolean = true;      // [object Boolean]
    var und = undefined;     // [object Undefined]
    var nul = null;          // [object Null]
    var obj = {a: 1}         // [object Object]
    var array = [1, 2, 3];   // [object Array]
    var date = new Date();   // [object Date]
    var error = new Error(); // [object Error]
    

    var reg = /a/g; // [object RegExp]
    var func = function a(){}; // [object Function]
    function checkType() {
    for (var i = 0; i < arguments.length; i++) {
    console.log(Object.prototype.toString.call(arguments[i]))
    }
    }
    checkType(number, string, boolean, und, nul, obj, array, date, error, reg, func)
    现在我们自己写一个type的函数来实现Object.prototype.toString。
    let classType = {};
    实现classType的映射
    'Boolean String Undefined Null Obejct Number'.split(' ').map(function(item){
    classType['[object'+item+']'] = item.toLowerCase();
    })
    function type(obj){
    在 IE6 中,null 和 undefined 会被 Object.prototype.toString 识别成 [object Object]!
    if(obj == null){
    return null+ '';
    }
    return typeof obj === 'object' || typeof obj === 'function' ?
    classType[Object.prototype.toString.call(obj)] || 'object' :
    typeof obj
    }


Log in to reply
 

Looks like your connection to 新前端社区 was lost, please wait while we try to reconnect.