在JavaScript中判断整型的N种方法示例介绍


Posted in Javascript onJune 18, 2014

整数类型(Integer)在JavaScript经常会导致一些奇怪的问题。在ECMAScript的规范中,他们只存在于概念中:

所有的数字都是浮点数,并且整数只是没有一组没有小数的数字。

在这篇博客中,我会解释如何去检查某个值是否为整型。
ECMAScript 5

在ES5中有很多方法你可以使用。有时侯,你可能想用自己的方法:一个isInteger(x)的函数,如果是整型返回true,否则返回false.

让我们看看一些例子。

通过余数检查

你可以使用余数运算(%),将一个数字按1求余,看看余数是不是0。

function isInteger(x) {
  return x % 1 === 0;
}

我喜欢这个方法,因为它非常简单,而且有效。

> isInteger(17)
true
> isInteger(17.13)
false

在操作余数运算时你得小心一点,因为结果取决于第一个数的符号,如果是正的,结果就是正的;否则就是负的。

> 3.5 % 1
0.5
> -3.5 % 1
-0.5

然后,我们也可以检查0,这其实不是一个问题。但问题是:这个方法对非数字也会返回true,因为 % 会将它转换成数字:

> isInteger('')
true
> isInteger('33')
true
> isInteger(false)
true
> isInteger(true)
true

可以通过很简单的类型检查来解决:

function isInteger(x) {
  return (typeof x === 'number') && (x % 1 === 0);
}

通过Math.round() 如果一个数字取整以后还跟之前的值一样,那么它就是整数。在JavaScript中可以通过Math.round()来检查:

function isInteger(x) {
  return Math.round(x) === x;
}

这个方法也不错

> isInteger(17)
true
> isInteger(17.13)
false

它也可以判断非数字,因为Math.round()总是返回数字,并且===只有当类型一样时才返回true.

> isInteger('')
false

如果你想让代码更清晰一点,你可以添加类型检查(就是我们在之前版本做的)。另外,Math.floor()和Math.ceil()可以像Math.round()一样工作。 通过位操作检查 位操作符提供另外一种“取整”的方法:

function isInteger(x) {
  return (x | 0) === x;
}

这个解决方案(跟其它位运算一样)有一个缺陷:它无法处理超过32位的数字。

> isInteger(Math.pow(2, 32))
false

通过parseInt()检查 parseInt()也提供了跟Math.round()类似将数字转换成整型的方法。 让我们看看这个方法为什么不错。

function isInteger(x) {
  return parseInt(x, 10) === x;
}

像Math.round()解决方案一样,它也可以处理非数字的情况,但是它也不能正确地处理所有的整型数字:

> isInteger(1000000000000000000000)
false

为什么?parseInt()在解析整数之前强迫将第一个参数解析成字符串。因此使用这种方法将数字转换成整型不是一个好的选择。

> parseInt(1000000000000000000000, 10)
1
> String(1000000000000000000000)
'1e+21'

就像上面那样,parseInt()在解析'1e+21'时在1处停止处理了,所以它才会返回1. ECMAScript 6 对于Math.round()扔补充,ES6提供了另外一个将数字转换成整型的方法:Math.trunc()。该函数会移除数字的小数部分。

> Math.trunc(4.1)
4
> Math.trunc(4.9)
4
> Math.trunc(-4.1)
-4
> Math.trunc(-4.9)
-4

此外,ECMAScript6不需要去处理检查整数那些琐碎的任务,因为它带有一个内置函数 Number.isInteger()。

Javascript 相关文章推荐
[原创]保存的js无法执行的解决办法
Feb 25 Javascript
菜鸟javascript基础资料整理2
Dec 06 Javascript
jquery实现多级下拉菜单的实例代码
Oct 02 Javascript
Javascript模拟加速运动与减速运动代码分享
Dec 11 Javascript
实用又漂亮的BootstrapValidator表单验证插件
May 30 Javascript
js输出数据精确到小数点后n位代码
Jul 02 Javascript
浅谈Angular的$q, defer, promise
Dec 20 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
Apr 13 jQuery
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
Sep 21 Javascript
实例分析JS与Node.js中的事件循环
Dec 12 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
Feb 03 Javascript
怎么理解wx.navigateTo的events参数使用详情
May 18 Javascript
input标签内容改变的触发事件介绍
Jun 18 #Javascript
jQuery控制TR显示隐藏的几种方法
Jun 18 #Javascript
对 jQuery 中 data 方法的误解分析
Jun 18 #Javascript
浅谈 jQuery 事件源码定位问题
Jun 18 #Javascript
js调试系列 源码定位与调试[基础篇]
Jun 18 #Javascript
js调试系列 控制台命令行API使用方法
Jun 18 #Javascript
js调试系列 初识控制台
Jun 18 #Javascript
You might like
PHP网上调查系统
2006/10/09 PHP
PHP 上传文件大小限制
2009/07/05 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
PHP实现变色验证码实例
2014/01/06 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
Prototype 工具函数 学习
2009/07/23 Javascript
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
vue使用Google地图的实现示例代码
2018/12/19 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
koa中间件核心(koa-compose)源码解读分析
2020/06/15 Javascript
python判断计算机是否有网络连接的实例
2018/12/15 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
python实现动态创建类的方法分析
2019/06/25 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
汽车检测与维修专业求职信
2013/10/30 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
募捐感谢信
2015/01/22 职场文书
西湖英语导游词
2015/02/06 职场文书
幼儿园小班个人工作总结
2015/02/12 职场文书
辞职信标准格式
2015/02/27 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
Python实现列表拼接和去重的三种方式
2021/07/02 Python
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
python可视化大屏库big_screen示例详解
2021/11/23 Python