这篇文章主要介绍了在JavaScript中判断整型的N种方法,需要的朋友可以参考下

整数类型(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 % 10.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()。

最新资讯
华为彭中阳:数字化不是零和游戏 面对挑战华为会更加开放

华为彭中阳:数字化不是

在今日的华为全联接大会上,华为董事、企业BG总裁彭中阳
趣头条谋变:战略调整 逃离亏损泥潭

趣头条谋变:战略调整

互联网的“中国速度”造就了很多明星公司,掀起一波又一
马斯克又画饼:特斯拉跑1000公里、卖17万、还不用人开……

马斯克又画饼:特斯拉跑

埃隆·马斯克在学习苹果这件事情上,越来越游刃有余了。
泡面为什么一定要泡3分钟?万万没想到,竟是利用这个特点

泡面为什么一定要泡3

泡面为什么一定要泡3分钟呢?2分钟或者4分钟不行吗?
科学好故事|窥探大脑内部:我们是如何产生情绪和欲望的

科学好故事|窥探大脑内

通过对大量的数据进行分析,神经科学家试图了解我们的大
马斯克:特斯拉上海超级工厂最终有望年产100万辆电动汽车

马斯克:特斯拉上海超级

在2020年的特斯拉股东大会上,埃隆·马斯克透露,上海超级
最新文章
详解Vue的ref特性的使用

详解Vue的ref特性的使

这篇文章主要介绍了详解Vue的ref特性的使用,文中通过
vue学习笔记之slot插槽基本用法实例分析

vue学习笔记之slot插

这篇文章主要介绍了vue学习笔记之slot插槽基本用法,结
vue跳转方式(打开新页面)及传参操作示例

vue跳转方式(打开新页

这篇文章主要介绍了vue跳转方式(打开新页面)及传参操作,
vue学习笔记之过滤器的基本使用方法实例分析

vue学习笔记之过滤器

这篇文章主要介绍了vue学习笔记之过滤器的基本使用方
js获取本日、本周、本月的时间代码

js获取本日、本周、本

本篇文章给大家分享的内容是利用js如何获取本日、本周
node crawler如何添加promise支持

node crawler如何添加

这篇文章主要介绍了node crawler如何添加promise支持,