在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 相关文章推荐
对采用动态原型方式无法展示继承机制得思考
Dec 04 Javascript
IE下双击checkbox反应延迟问题的解决方法
Mar 27 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
Aug 18 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
Jun 09 Javascript
javascript实现获取图片大小及图片等比缩放的方法
Nov 24 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
Sep 06 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
vue 解决路由只变化参数页面组件不更新问题
Nov 05 Javascript
vue将data恢复到初始状态 && 重新渲染组件实例
Sep 04 Javascript
js实现电灯开关效果
Jan 19 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
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
在Python中操作字典之clear()方法的使用
2015/05/21 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
分分钟入门python语言
2018/03/20 Python
python数据化运营的重要意义
2019/11/25 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
学前教育专业毕业生自荐信
2013/10/03 职场文书
高中生学习生活的自我评价
2013/11/27 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
计算机专业自荐信
2014/05/24 职场文书
南京青奥会口号
2014/06/12 职场文书
审美与表现自我评价
2015/03/09 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书