前言

    在web应用中类型判断很常用,例如基于Javascript的基本数据类型string、number的判断,基于复杂数据类型对象和数组的判断等等,还有更复杂的例如plainObject、空对象、window对象等。

    类型判断的几种方式

    Javascript中的数据类型:基本数据类型(Null、Undefined、String、Number、Boolean、Symbol)和复杂数据类型(Object、Array、Date、Function、RegExp、Error等)

    • typeof
    • instanceof
    • constructor
    • Object.prototype.toString.call()
    • 判断数组有特有的:Array.isArray

    两种常用于数据类型判断的方法

    • typeof
    • Object.prototype.toString

      typeof

      ** **能辨别: 基本数据类型:Number、String、Boolean、Undefined,复杂类型:Function。
      不能辨别: Null和除Function之外的其他复杂数据类型

    1. typeof undefined //"undefined"
    2. typeof 2 //"number"
    3. typeof "youyi" //"string"
    4. typeof true //"boolean"
    5. typeof Symbol() // "symbol"
    6. typeof b //"undefined" 需要注意未申明的变量也会类型判断为undefined

    Object.prototype.toString

    可以辨别出所有的类型

    1. var number = 1; // [object Number]
    2. var string = '123'; // [object String]
    3. var boolean = true; // [object Boolean]
    4. var und = undefined; // [object Undefined]
    5. var nul = null; // [object Null]
    6. var obj = {a: 1} // [object Object]
    7. var array = [1, 2, 3]; // [object Array]
    8. var date = new Date(); // [object Date]
    9. var error = new Error(); // [object Error]
    10. var reg = /a/g; // [object RegExp]
    11. var func = function a(){}; // [object Function]
    12. var window = window; //[object Window]
    13. var location = location; //[object Location]
    14. function checkType() {
    15. for (var i = 0; i < arguments.length; i++) {
    16. console.log(Object.prototype.toString.call(arguments[i]))
    17. }
    18. }
    19. checkType(number, string, boolean, und, nul, obj, array, date, error, reg, func,window,location)

    封装判断Js数据类型的方法
    满足以下条件:
    1、IE6下Null、Undefined会被Object.prototype.toString.call转换成[object Object]的情况
    2、对于Js数据类型判断,返回对应类型的小写字符串

    var typeMaps = {}
    "Boolean Number String Function Array Date RegExp Object Error".split(' ').map(item=> {
              typeMaps["[object "+item+"]"] = item.toLowerCase()
    })
    function type(obj) {
         if(obj == null) { //undefined == null为true;'' == null 为false;
          return obj + ''
         }
        return  typeof obj === "object" || typeof obj === "function" ?  typeMaps[Object.prototype.toString.call(obj) ] || Object : typeof obj;
    }
    

    额外补充关于“==”比较两个值是否相等的问题

    类型 Number String Null Undefined
    Number
    String 字符串先转数字再比较 ‘’ == null
    不相等
    Null 总不相等 相等 相等
    Undefined 总不相等 相等 相等
    Boolean 布尔值转数字再比较

    参考资料:
    https://github.com/mqyqingfeng/Blog/issues/28