JavaScript 中不区分整数和浮点数, 所有数字内部都采用 64 位浮点格式表示, 和 Java 的 double 类型一样. 但实际操作中比如数组索引, 位操作则是基于 32 位整数.
JavaScript 判断是否为整数的方法:
方式一, 使用取余运算符判断
任何整数都会被 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,
因此, 需要先判断下对象是否是数字, 比如加一个 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
原因是 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
来源: http://www.css88.com/qa/javascript/10940.html