一行代码实现数据类型判断
为什么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
一行代码实现数据类型判断相关推荐
- python怎么返回上一行代码_Python实现判断一行代码是否为注释的方法
目前的编辑器大都可以自动检测某一行代码是否为代码行或注释行,但并不太提供代码行/注释行行数的统计,对于大量代码文件的代码行/注释行统计,就更少见一些.本篇文章试用一段Python脚本来实现这一目标,并 ...
- php根据日期判断星座if函数,js 日期计算星座 根据生日的月份和日期,一行代码计算星座的js小函数(转)...
本文最后更新于2019-07-01,已超过 1年没有更新,如果文章内容.图片或者下载资源失效,请留言反馈,我会及时处理,谢谢! 温馨提示:本文共2388个字,读完预计6分钟. 摘要: 根据生日的月份和 ...
- 一行代码,搞定浏览器数据库 IndexedDB
作者 | 星尘starx 来源 | https://juejin.cn/post/6918705632757415950 前言 2021 年,如果你的前端应用,需要在浏览器上保存数据,有三个主流方案可 ...
- 开源作品ThinkJDBC—一行代码搞定数据库操作
1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...
- 【Python】Python一行代码能做什么,30个实用案例代码详解
Python语法简洁,能够用一行代码实现很多有趣的功能,这次来整理30个常见的Python一行代码集合. 1.转置矩阵 old_list = [[1, 2, 3], [3, 4, 6], [5, 6, ...
- Python之每个人都应该知道的30个一行代码程序
Python 语法简洁,能够用一行代码实现很多有趣的功能,现在整理 30 个常见的 Python 一行代码集合. ① 转置矩阵 old_list = [[1, 2, 3], [3, 4, 6], [5 ...
- python基础知识-8-三元和一行代码(推导式)
python其他知识目录 1.三元运算(三目运算) 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值 格式:[on_true] if [expression] else [on_false] ...
- indexed true mysql_一行代码,搞定浏览器数据库 IndexedDB
前言 2021 年,如果你的前端应用,需要在浏览器上保存数据,有三个主流方案可以选择: Cookie:上古时代就已存在,但能应用的业务场景非常有限 LocalStorage:使用简单灵活,但是容量只有 ...
- thinkjdbc 关闭_ThinkJD: ThinkJD,又名ThinkJDBC,一个强大的开源JDBC/ORM操作库,让你尽可能简洁地用一行代码搞定数据库操作。...
1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...
最新文章
- 附录4:Matplotlib实例记录
- asp.net 添加成功弹出个div提示_Word双栏目录怎么做,这3个步骤早知道,让人眼前一亮...
- RHCSA笔记整理(1)
- Elasticsearch Reference [6.7] » Modules » Network Settings
- shell执行oracle存储过程,获得存储过程返回值
- JAVA-入门(内含jdk配置)
- php获取location,php获取header[‘location’]信息常见问题
- array.slice_Ruby中带有示例的Array.slice()方法
- c++代码根据点位连线_邹军:数控车倒角C与自动倒圆角R编程方法
- elasticearch 安装
- 训练深度神经网络时验证损失可能低于训练损失的三个原因:
- 改版更新后的领英职场不能搜索开发客户怎么办?两种方法加一个工具解决
- dell网卡linux驱动,Dell R720上安装linux网卡驱动
- matlab 积分后带int,matlab int 积分
- 高射炮打蚊子丨在VS 2017里用C语言写经典的冒泡排序
- OpenCV_连通区域分析(Connected Component Analysis-Labeling)
- mysql入门_高洛峰_简介_linux安装_远程连接配置_sql语句初始
- 我的helloworld
- 【技术解析】数通是什么?
- java组合_Java组合
热门文章
- 语义分割--Understanding Convolution for Semantic Segmentation
- 图片格式转换(PNG or JPEG to EPS or PDF)
- Python-PyCharm 报错解决:ImportError: cannot import name 'InteractiveConsole' from 'code'
- LeetCode 75. Sort Colors--Python解法
- C++ ——统一初始化
- Intellij IDEA 2020.1 的Plugins 搜索不了插件,连接超时
- Tomcat双向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端超安全通信
- 包package,权限修饰符
- 16张思维导图+学习路线图,囊括所有Python基础,可打印
- java 全局变量_Java语言与C语言、C++语言有何差异以及优劣势