在JavaScript中判断整型的N种方法示例介绍


Posted in Javascript onJune 18, 2014

整数类型(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()。

Javascript 相关文章推荐
Js的MessageBox
Dec 03 Javascript
Dom在ajax技术中的作用说明
Oct 25 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
Jun 19 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 Javascript
JavaScript驾驭网页-CSS与DOM
Mar 24 Javascript
谈一谈js中的执行环境及作用域
Mar 30 Javascript
jQuery操作cookie
Aug 08 Javascript
Javascript中click与blur事件的顺序详析
Apr 25 Javascript
CKeditor4 字体颜色功能配置方法教程
Jun 26 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
Nov 11 jQuery
ES2020系列之空值合并运算符 '??'
Jul 22 Javascript
input标签内容改变的触发事件介绍
Jun 18 #Javascript
jQuery控制TR显示隐藏的几种方法
Jun 18 #Javascript
对 jQuery 中 data 方法的误解分析
Jun 18 #Javascript
浅谈 jQuery 事件源码定位问题
Jun 18 #Javascript
js调试系列 源码定位与调试[基础篇]
Jun 18 #Javascript
js调试系列 控制台命令行API使用方法
Jun 18 #Javascript
js调试系列 初识控制台
Jun 18 #Javascript
You might like
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
深入讲解PHP的对象注入(Object Injection)
2017/03/01 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
javascript学习指南之回调问题
2016/04/23 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
Python内置类型性能分析过程实例
2020/01/29 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
医学护理系毕业生求职信
2013/10/01 职场文书
电子商务专业学生职业生涯规划
2014/03/07 职场文书
茶花女读书笔记
2015/06/29 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL