OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

在JavaScript中判断整型的N种方法


分享到


分类 编程技巧   关键字 JavaScript   发布 kris  1401582307897
注意 转载须保留原文链接,译文链接,作者译者等信息。  
整数类型(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()。

社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 编程是一个没有前途的工作
  2. 是什么让Node.js比Java更快?
  3. 我不想雇佣女性
  4. 现在,你为什么应该学Node.js
  5. Google正在拖互联网的后腿
  6. JavaScript中NaN的秘密
  7. 使用集群(recluster)扩展多线程Node.JS
  8. 用JavaScript的5个原因
  9. jQuery:在一个回调中处理多个请求
  10. 趣图:在NodeJS程序中有未处理的异常
  11. 用 OnceAir 搭建个人Git/Svn/照片备份服务器,每年电费7块钱

 相关阅读 - 编程技巧
  1. 你应该使用HTML5的header和footer标签吗?
  2. 功夫:HTML和CSS?
  3. Linux命令及Linux终端的20个趣事
  4. 在NodeJS中启用ECMAScript 6
  5. 如何提高NODE.js中SSL服务的性能
  6. 极快的node.js:来自领英(LinkedIn)移动的10个性能技巧
  7. 在JavaScript里写类层次结构?别那么做!
  8. 字符串(String)模板被视为是有害的
  9. 用纯CSS实现的箭头
  10. 使用Javascript将相对路径地址转换为绝对路径

 关键字 - JavaScript
  1. 用JavaScript获取当月第一天和最后一天
  2. 用JavaScript测试图像上两点之间的距离
  3. JSON序列化(stringify)对象时排除某些属性的两种方法
  4. 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解
  5. JavaScript运算出现很多小数导致运算不精确的问题,用toFixed解决
  6. 用JavaScript实现node.js中的path.join方法
  7. 如何用CSS将select/option文本居中或居右对齐
  8. JavaScript中新建一个带全局变量参数的new Function动态函数
  9. 设置select元素中option的默认值
  10. 在JavaScript中创建命名空间的几种写法

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号