JavaScript中判断整数的多种方法总结


Posted in Javascript onNovember 08, 2014

之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer)。

JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的double类型一样。但实际操作中比如数组索引、位操作则是基于32位整数。

方式一、使用取余运算符判断

任何整数都会被1整除,即余数是0。利用这个规则来判断是否是整数。

function isInteger(obj) {

    return obj%1 === 0

}

isInteger(3) // true

isInteger(3.3) // false

以上输出可以看出这个函数挺好用,但对于字符串和某些特殊值显得力不从心

isInteger('') // true

isInteger('3') // true

isInteger(true) // true

isInteger([]) // true

对于空字符串、字符串类型数字、布尔true、空数组都返回了true,真是难以接受。对这些类型的内部转换细节感兴趣的请参考:JavaScript中奇葩的假值

因此,需要先判断下对象是否是数字,比如加一个typeof

function isInteger(obj) {

    return typeof obj === 'number' && obj%1 === 0

}

isInteger('') // false

isInteger('3') // false

isInteger(true) // false

isInteger([]) // false

嗯,这样比较完美了。

二、使用Math.round、Math.ceil、Math.floor判断

整数取整后还是等于自己。利用这个特性来判断是否是整数,Math.floor示例,如下

function isInteger(obj) {

    return Math.floor(obj) === obj

}

isInteger(3) // true

isInteger(3.3) // false

isInteger('') // false

isInteger('3') // false

isInteger(true) // false

isInteger([]) // false

这个直接把字符串,true,[]屏蔽了,代码量比上一个函数还少。

三、通过parseInt判断

function isInteger(obj) {

    return parseInt(obj, 10) === obj

}

isInteger(3) // true

isInteger(3.3) // false

isInteger('') // false

isInteger('3') // false

isInteger(true) // false

isInteger([]) // false

很不错,但也有一个缺点
isInteger(1000000000000000000000) // false

竟然返回了false,没天理啊。原因是parseInt在解析整数之前强迫将第一个参数解析成字符串。这种方法将数字转换成整型不是一个好的选择。

四、通过位运算判断

function isInteger(obj) {

    return (obj | 0) === obj

}

isInteger(3) // true

isInteger(3.3) // false

isInteger('') // false

isInteger('3') // false

isInteger(true) // false

isInteger([]) // false

这个函数很不错,效率还很高。但有个缺陷,上文提到过,位运算只能处理32位以内的数字,对于超过32位的无能为力,如
isInteger(Math.pow(2, 32)) // 32位以上的数字返回false了

当然,多数时候我们不会用到那么大的数字。

五、ES6提供了Number.isInteger

Number.isInteger(3) // true

Number.isInteger(3.1) // false

Number.isInteger('') // false

Number.isInteger('3') // false

Number.isInteger(true) // false

Number.isInteger([]) // false

目前,最新的Firefox和Chrome已经支持。

Javascript 相关文章推荐
新浪刚打开页面出来的全屏广告代码
Apr 02 Javascript
javascript:void(0)的真正含义实例分析
Aug 20 Javascript
20个最新的jQuery插件
Jan 13 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
Mar 25 Javascript
AngularJS中指令的四种基本形式实例分析
Nov 22 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
Apr 21 Javascript
利用JS测试目标网站的打开响应速度
Dec 01 Javascript
Vue波纹按钮组件制作
Apr 30 Javascript
Vue 样式绑定的实现方法
Jan 15 Javascript
一文了解Vue中的nextTick
May 06 Javascript
详解ES6 export default 和 import语句中的解构赋值
May 28 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
Jul 22 Javascript
JavaScript中判断整字类型最简洁的实现方法
Nov 08 #Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
Nov 08 #Javascript
JavaScript函数模式详解
Nov 07 #Javascript
JavaScript代码复用模式详解
Nov 07 #Javascript
JavaScript中的style.cssText使用教程
Nov 06 #Javascript
JavaScript组合拼接字符串的效率对比测试
Nov 06 #Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
Nov 06 #Javascript
You might like
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
js验证账户名是否重复
2020/05/26 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
django 多数据库配置教程
2018/05/30 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
2021/01/05 Python
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
解释一下钝化(Swap out)
2016/12/26 面试题
陈欧的广告词
2014/03/18 职场文书
大学生自我鉴定书
2014/03/24 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
单方投资意向书
2015/05/11 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
详解MongoDB的条件查询和排序
2021/06/23 MongoDB