开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JavaScript中判断为整数的多种方式

简介: 原文:JavaScript中判断为整数的多种方式 之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer)。 JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示。
+关注继续查看
原文:JavaScript中判断为整数的多种方式

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

JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示。但实际操作中比如数组索引、位操作则是基于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中奇葩的假值

JavaScript中的隐式类型转换

世界上最短的数字判断代码

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
javascript生成n至m的随机整数
javascript生成n至m的随机整数
35 0
javascript生成n至m的随机整数
摘要:   本文讲解如何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备。   Math.random()函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) 生成n-m,包含n但不包含m的整数: 第一步算出 m-n的值,假设等于w 第二步Math.
959 0
HOT100——盛最多水的容器(JS实现)
HOT100——盛最多水的容器(JS实现)
84 0
HOT100——正则表达式匹配(JS实现)
HOT100——正则表达式匹配(JS实现)
70 0
HOT100——最长回文子串(JS实现)
HOT100——最长回文子串(JS实现)
63 0
HOT100——寻找两个正序数组的中位数(JS实现)
HOT100——寻找两个正序数组的中位数(JS实现)
125 0
HOT100——无重复字符的最长子串(JS实现)
HOT100——无重复字符的最长子串(JS实现)
63 0
剑指Offer——最长不含重复字符的子字符串(JS实现)
剑指Offer——最长不含重复字符的子字符串(JS实现)
82 0
剑指Offer——1~n整数中1出现的次数(JS实现)
剑指Offer——1~n整数中1出现的次数(JS实现)
67 0
剑指Offer——II. 队列的最大值(JS实现)
剑指Offer——II. 队列的最大值(JS实现)
93 0
+关注
杰克.陈
一个安静的程序猿~
10424
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载