实现一个工具类,判断任意数据类型

272 阅读2分钟

  在JavaScript中数据类型分为两类,一类是基础数据类型,包括String(字符)、Number(数字)、Boolean(布尔)、null(空)、undefined(未定义)、Symbol(ES6新增),另一类是复杂数据类型 Object。

  基本数据类型可以除null外,通过 typeof 检测数据类型,函数也可以检测,如何检测出数据是null还是ObjectArray,没有统一的方法进行检测。

  在之前的数组类型检测中会用到这样一种方法:

    function isArray(obj){
        return Object.prototype.toString.call(obj) === '[object Array]' ? true : false;
    }

  用这个方法就可以区分出ObjectArray,同样的null也可以通过这种方法进行判断;

    Object.prototype.toString.call(null);  // => '[object Null]'

  经过尝试发现,不论是基础数据类型还是复杂数据类型,都可以通过这种方法得到相应的字符。如[object String][object Number],利用这样的思路,就可以制作出一个工具类,用于判断是否为该类型的数据。

    var typeArr = ['Array', 'Set', 'Object', 'Number', 'String', 'Null', 'Undefined', 'Boolean', 'Function', 'Symbol'];
    var Type = {};
    for (let i = 0, l = typeArr.length; i < l; i++) {
        ((type) => {
            Type['is' + type] = function (value) {
                return Object.prototype.toString.call(value) === '[object ' + type + ']'
            }
        })(typeArr[i]);
    }

  有了该工具类只能够辨别出相对应的类型,那如何判断某个数据是哪种类型呢。

  我这里想到的是对所有的方法循环调用,如果类型符合就返回相应的类型字符。在添加这个属性方法时,该方法是可以访问,但不能够遍历的。

    Object.defineProperty(Type, 'typeOf', {
        value: function (value) {
            var _self = this;
            for (let key in _self) {
                if (_self[key](value)) {
                    return key.slice(2);
                }
            }
            return '未知';
        }
    });

  这样就可以使用该工具中封装的方法判断是否为某种数据类型,还可以检测数据具体为哪种类型的。

  将方法封装成模块,方便调用。

对方法进行封装,返回对象

var Type = (function () {
    var typeArr = ['Array', 'Set', 'Object', 'Number', 'String', 'Null', 'Undefined', 'Boolean', 'Function', 'Symbol'];
    var Type = {};
    for (let i = 0, l = typeArr.length; i < l; i++) {
        ((type) => {
            Type['is' + type] = function (value) {
                return Object.prototype.toString.call(value) === '[object ' +
                    type + ']'
            }
        })(typeArr[i]);
    }
    Object.defineProperty(Type, 'typeOf', {
        value: function (value) {
            var _self = this;
            for (let key in _self) {
                if (_self[key](value)) {
                    return key.slice(2);
                }
            }
            return '未知';
        }
    });
    return Type;
})();

// 实现一个函数,判断数据是什么类型
var checkType = function (checkObj) {
    return Type.typeof.call(Type, checkObj);
}

ES6模块

    // ES6导出模块
    export {Type,checkType};

    // ES6引入模块
    import {Type,checkType} from './checkType.js'

commonJS模块

    // commonJS 导出
    module.exports = {
        Type,
        checkType
    }
    // commonJS 导入
    let {Type,checkType} = require('./checkType.js');

具体代码参考 实现工具类,检测数据类型

判断数据类型的多种方法和区别