在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 相关文章推荐
javascript 简练的几个函数
Aug 29 Javascript
js获取视频时长代码
Apr 10 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
Sep 04 Javascript
javascript 用函数实现继承详解
May 28 Javascript
原生js获取元素样式的简单方法
Aug 06 Javascript
jQuery插件form-validation-engine正则表达式操作示例
Feb 09 Javascript
vue中七牛插件使用的实例代码
Jul 28 Javascript
Vue项目自动转换 px 为 rem的实现方法
Oct 29 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
Oct 11 Javascript
详解React 元素渲染
Jul 07 Javascript
解决antd Form 表单校验方法无响应的问题
Oct 27 Javascript
vue绑定class的三种方法
Dec 24 Vue.js
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缓冲 output_buffering的使用详解
2013/06/13 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
php常用的工具开发整理
2019/09/26 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
JavaScript 拖拉缩放效果
2008/12/10 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
2013/11/26 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
Vue 修改网站图标的方法
2020/12/31 Vue.js
Python中关键字is与==的区别简述
2014/07/31 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
Python3 socket同步通信简单示例
2017/06/07 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
python绘制直方图和密度图的实例
2019/07/08 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
python如何调用百度识图api
2020/09/29 Python
Python识别验证码的实现示例
2020/09/30 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
土建专业大学生自荐信范文
2014/04/09 职场文书
英语课外活动总结
2014/08/27 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
个人委托书怎么写
2014/09/17 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
2014年店长工作总结
2014/11/17 职场文书