一行代码实现数据类型判断

发布于 2021-11-17 12:46:42 字数 3738 浏览 1206 评论 0

JS 判断数据类型,方法有很多,如 typeof、constructor、toString 等等,甚至可以使用 jQuery 内部的 $.type 都可以判断。其中 typeof 等的判断局限性都比较大,如 typeof 只能判断数据存储类型,constructor 只能判断数据的原型,toString 相对比较完整一点,但显示不够友好,在 jQuery 中对其做了一些修饰,正是 Object.prototype.toString 的功劳。

Object.prototype.toString.call(1)
// "[object Number]"

Object.prototype.toString.call('1')
// "[object String]"

Object.prototype.toString.call({})
// "[object Object]"

Object.prototype.toString.call([])
// "[object Array]"

Object.prototype.toString.call(window)
// "[object global]"

注意到了吗?每个数据类型的返回值都有一个相同点,那就是 [object],通过取值后面的文字可以获取到该对象的数据类型。即:

Object.prototype.toString.call(object).slice(8, -1).toLowerCase();

Object.prototype.toString.call(1).slice(8, -1).toLowerCase();
// "number"

Object.prototype.toString.call('1').slice(8, -1).toLowerCase();
// "string"

Object.prototype.toString.call({}).slice(8, -1).toLowerCase();
// "object"

Object.prototype.toString.call([]).slice(8, -1).toLowerCase();
// "array"

Object.prototype.toString.call(window).slice(8, -1).toLowerCase();
// "global"

初始的 typeis 就是这样的:

/**
 * 判断数据类型
 * @param obj {*} 任何数据
 * @returns {string}
 */
var typeis = function (obj) {
    return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
};

通过测试可知:

typeis(NaN);
// "number"

不太符合预期,需要额外判断一次

/**
 * 判断数据类型
 * @param obj {*} 任何数据
 * @returns {string}
 */
var typeis = function (obj) {
    var ret = Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();

    if(isNaN(obj) && ret === 'number'){
        return 'nan';
    }

    return ret;
};

判断 element 元素的时候:

typeis(document.body)
// "htmlbodyelement"
typeis(document.head)
// "htmlheadelement"

不符合预期,再修改:

/**
 * 判断数据类型
 * @param obj {*} 任何数据
 * @returns {string}
 */
var typeis = function (obj) {
    var ret = Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();

    if (isNaN(obj) && ret === 'number') {
        return 'nan';
    } else if (/element/.test(ret)) {
        return 'element';
    }

    return ret;
};

最后再对一些全局对象,做些处理:

/**
 * 判断数据类型
 * @param obj {*} 任何数据
 * @returns {string}
 */
var typeis = function (obj) {
    var udf = 'undefined';
    
    if (typeof obj === udf) {
        return udf;
    } else if (typeof window !== udf && obj === window) {
        return 'window';
    } else if (typeof global !== udf && obj === global) {
        return 'global';
    } else if (typeof document !== udf && obj === document) {
        return 'document';
    } else if (obj === null) {
        return 'null';
    }
    
    var ret = Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();

    if (isNaN(obj) && ret === 'number') {
        return 'nan';
    } else if (/element/.test(ret)) {
        return 'element';
    }

    return ret;
};

一个比较完善、完整的 typeis 就出来了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
479 人气
更多

推荐作者

qq_Yqvrrd

文章 0 评论 0

2503248646

文章 0 评论 0

浮生未歇

文章 0 评论 0

养猫人

文章 0 评论 0

第七度阳光i

文章 0 评论 0

新雨望断虹

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文