为什么80%的码农都做不了架构师?>>>   

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 就出来了。

转载于:https://my.oschina.net/ecp/blog/635421

一行代码实现数据类型判断相关推荐

  1. python怎么返回上一行代码_Python实现判断一行代码是否为注释的方法

    目前的编辑器大都可以自动检测某一行代码是否为代码行或注释行,但并不太提供代码行/注释行行数的统计,对于大量代码文件的代码行/注释行统计,就更少见一些.本篇文章试用一段Python脚本来实现这一目标,并 ...

  2. php根据日期判断星座if函数,js 日期计算星座 根据生日的月份和日期,一行代码计算星座的js小函数(转)...

    本文最后更新于2019-07-01,已超过 1年没有更新,如果文章内容.图片或者下载资源失效,请留言反馈,我会及时处理,谢谢! 温馨提示:本文共2388个字,读完预计6分钟. 摘要: 根据生日的月份和 ...

  3. 一行代码,搞定浏览器数据库 IndexedDB

    作者 | 星尘starx 来源 | https://juejin.cn/post/6918705632757415950 前言 2021 年,如果你的前端应用,需要在浏览器上保存数据,有三个主流方案可 ...

  4. 开源作品ThinkJDBC—一行代码搞定数据库操作

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

  5. 【Python】Python一行代码能做什么,30个实用案例代码详解

    Python语法简洁,能够用一行代码实现很多有趣的功能,这次来整理30个常见的Python一行代码集合. 1.转置矩阵 old_list = [[1, 2, 3], [3, 4, 6], [5, 6, ...

  6. Python之每个人都应该知道的30个一行代码程序

    Python 语法简洁,能够用一行代码实现很多有趣的功能,现在整理 30 个常见的 Python 一行代码集合. ① 转置矩阵 old_list = [[1, 2, 3], [3, 4, 6], [5 ...

  7. python基础知识-8-三元和一行代码(推导式)

    python其他知识目录 1.三元运算(三目运算) 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值 格式:[on_true] if [expression] else [on_false] ...

  8. indexed true mysql_一行代码,搞定浏览器数据库 IndexedDB

    前言 2021 年,如果你的前端应用,需要在浏览器上保存数据,有三个主流方案可以选择: Cookie:上古时代就已存在,但能应用的业务场景非常有限 LocalStorage:使用简单灵活,但是容量只有 ...

  9. thinkjdbc 关闭_ThinkJD: ThinkJD,又名ThinkJDBC,一个强大的开源JDBC/ORM操作库,让你尽可能简洁地用一行代码搞定数据库操作。...

    1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...

最新文章

  1. 附录4:Matplotlib实例记录
  2. asp.net 添加成功弹出个div提示_Word双栏目录怎么做,这3个步骤早知道,让人眼前一亮...
  3. RHCSA笔记整理(1)
  4. Elasticsearch Reference [6.7] » Modules » Network Settings
  5. shell执行oracle存储过程,获得存储过程返回值
  6. JAVA-入门(内含jdk配置)
  7. php获取location,php获取header[‘location’]信息常见问题
  8. array.slice_Ruby中带有示例的Array.slice()方法
  9. c++代码根据点位连线_邹军:数控车倒角C与自动倒圆角R编程方法
  10. elasticearch 安装
  11. 训练深度神经网络时验证损失可能低于训练损失的三个原因:
  12. 改版更新后的领英职场不能搜索开发客户怎么办?两种方法加一个工具解决
  13. dell网卡linux驱动,Dell R720上安装linux网卡驱动
  14. matlab 积分后带int,matlab int 积分
  15. 高射炮打蚊子丨在VS 2017里用C语言写经典的冒泡排序
  16. OpenCV_连通区域分析(Connected Component Analysis-Labeling)
  17. mysql入门_高洛峰_简介_linux安装_远程连接配置_sql语句初始
  18. 我的helloworld
  19. 【技术解析】数通是什么?
  20. java组合_Java组合

热门文章

  1. 语义分割--Understanding Convolution for Semantic Segmentation
  2. 图片格式转换(PNG or JPEG to EPS or PDF)
  3. Python-PyCharm 报错解决:ImportError: cannot import name 'InteractiveConsole' from 'code'
  4. LeetCode 75. Sort Colors--Python解法
  5. C++ ——统一初始化
  6. Intellij IDEA 2020.1 的Plugins 搜索不了插件,连接超时
  7. Tomcat双向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端超安全通信
  8. 包package,权限修饰符
  9. 16张思维导图+学习路线图,囊括所有Python基础,可打印
  10. java 全局变量_Java语言与C语言、C++语言有何差异以及优劣势