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 相关文章推荐
window.location.href中url中数据量太大时的解决方法
Dec 23 Javascript
深入理解JavaScript中的箭头函数
Jul 28 Javascript
jQuery自制提示框tooltip改进版
Aug 01 Javascript
jQuery简单创建节点的方法
Sep 09 Javascript
js动态生成form 并用ajax方式提交的实现方法
Sep 09 Javascript
JavaScript获取键盘按键的键码(参照表)
Jan 10 Javascript
AngularJS基于factory创建自定义服务的方法详解
May 25 Javascript
微信小程序解除10个请求并发限制
Dec 18 Javascript
详解Node.js一行命令上传本地文件到服务器
Apr 22 Javascript
微信小程序调用微信支付接口的实现方法
Apr 29 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
Oct 16 Javascript
js调用网络摄像头的方法
Dec 05 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
用session做客户验证时的注意事项
2006/10/09 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
php筛选不存在的图片资源
2015/04/28 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
python连接mysql调用存储过程示例
2014/03/05 Python
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
浅谈编码,解码,乱码的问题
2016/12/30 Python
Python continue继续循环用法总结
2018/06/10 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
python实现京东秒杀功能
2018/07/30 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
中间件分为哪几类
2012/03/14 面试题
优秀老员工获奖感言
2014/02/15 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
集中整治工作方案
2014/05/01 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
初一英语教学反思
2016/02/15 职场文书
中学教代会开幕词
2016/03/04 职场文书