integer 类型在javascript中很奇怪。ECMAScript技术规格说明书中,它是以概念的形式存在。number类型包括浮点型(floating )和整形(integer )不包括小数(详情参考 “Integers in JavaScript” in “Speaking JavaScript”)。在这篇博客中Dr. Axel Rauschmayer  大师将解释如何检查一个值是否为integer。

ECMAScript 5

有很多方式可以检查一个值是否为integer. 在此, 你可以休息一下并且试着写一下你自己的解决方案。例如: 定义一个 function isInteger(x),如果它是(integer )让它返回 true  或者返回 false。

让我们看一下大师的小例子.

使用整除进行检查(Checking via the remainder operator)

首先我们可以使用 remainder operator (%) 去运算 number类型是不是一个 integer。number 类型整除 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

我们也可以检查传入的值是不是 zero(0),这里 zero(0)不是讨论的重点. 但是会有一个问题出现: 这个function 会当传入的值为non-number时 return true   因为 整除符号(%)会强制将传入的值转换为 numbers:

    > isInteger('')
true
> isInteger('33')
true
> isInteger(false)
true
> isInteger(true)
true

所以这里我们在加上一个类型的判断(typeof):

   function isInteger(x) {
return (typeof x === 'number') && (x % 1 === 0);
}

使用Math.round()方法进行检查(Checking via Math.round())

如果一个number类型调用round()函数后很接近Integer类型,那么他就是Integer类型. 方法来自于 JavaScript的 Math.round():

    function isInteger(x) {
return Math.round(x) === x;
}

运算结果如下:

    > isInteger(17)
true
> isInteger(17.13)
false

这样也控制了 non-numbers 的正确性, 因为Math.round() 总是返回 numbers。  如果===两边的类型一致结果返回 true.

 > isInteger('')
false

如果你想让你的代码计算更为清楚,你可以添加类型的检查(如我们前面所做的 typeof). 此外, Math.floor() 和Math.ceil() 也可以像Math.round()一样来判断是否为Integer.

使用位运算付进行检查(Checking via bitwise operators)

位操作符提供了一种   number 转换为 integer的方法:

   function isInteger(x) {
return (x | 0) === x;
}

该解决方案(与基于运算符的其他解决方案)有一个缺点:它不能处理超过32位数字。.

    > isInteger(Math.pow(2, 32))
false

使用parseInt()进行检查(Checking via parseInt())

parseInt() 也提供了将 numbers 转换为 integers 的方法,使用起来类似于 Math.round(). 我们来可以下parseInt()是不是一个好的解决办法.

 function isInteger(x) {
return parseInt(x, 10) === x;
}

Math.round() 的解决方案来说,  对 non-numbers 的处理很好,但是他不能检测所有的numbers类型是不是integers类型:

  > isInteger(1000000000000000000000)
false

Why? parseint()强制它的第一个参数解析为字符串在进行数字运算之前。这不是一个很好的选择,将数字转换成整数.

    > parseInt(1000000000000000000000, 10)
1
> String(1000000000000000000000)
'1e+21'

以上, 就是parseInt() 在解析 '1e+21'时停止解析,在解析到e的时候停止数字运算了, 这就是为什么返回1.

Other solutions

大神他相信会有更多的解决方案在 Twitter中, 感兴趣的朋友check them out.

ECMAScript 6

补充 Math.round() et al., ECMAScript 6 提供了额外的 numbers 转换为 integers的方式: Math.trunc(). 这个函数删除了number的小数部分:

    > Math.trunc(4.1)
4
> Math.trunc(4.9)
4
> Math.trunc(-4.1)
-4
> Math.trunc(-4.9)
-4

不久的将来, ECMAScript 6 将添加对 integers类型的琐碎校验, 因为添加了 Number.isInteger()方法.

Further reading

  • Converting to Integer” (in “Speaking JavaScript”) covers the most common ways of converting numbers to integers.
  • Safe Integers” (in “Speaking JavaScript”) explains what range of integers can be safely used in JavaScript and what “safely used” means.

备注:此文章源自 Dr. Axel Rauschmayer ,一切版权都为大师所有。

详情见大师blog:http://www.2ality.com/2014/05/is-integer.html

Speaking JavaScript也是大师不错的一本书,链接地址为:http://speakingjs.com/es5/index.html#pt03

在javascript中检查一个值是否为integer的更多相关文章

  1. javascript中的原始值和复杂值

    × 目录 [1]特性 [2]存储方式 [3]访问方式 [4]比较方式 [5]动态属性 前面的话 javascript的数据类型可以分为两种:原始类型和引用类型.原始类型也称为基本类型或简单类型,jav ...

  2. Javascript中的Keycode值列表

    关于如何得到一个键在Javascript中的Keycode值,可以参考: <body onkeypress=alert(event.keyCode)>请按任意键,你将得到该键的键值! ke ...

  3. 如何在 JavaScript 中检查字符串是否包含子字符串?

    如何在 JavaScript 中检查字符串是否包含子字符串? // var test4 = _.includes(string, substring); 该方法需要此文件 <script src ...

  4. javascript中,一个js中的函数,第一句var _this = this;为什么要这样做?

    javascript中,一个js中的函数,第一句var _this = this;为什么要这样做? 下面是源码: 下面这段代码是常用的网站首页,自动切换span或者tabbar来变更List显示内容的 ...

  5. 你知道JavaScript中的结果值是什么吗?

    你知道JavaScript中的每条语句.甚至表达式都有一个结果值吗? 当你在浏览器中测试代码时,经常会在控制台的输出结果的最后面多出一条,大部分为undefined,这个undefined就是一个结果 ...

  6. Razor语法中绑定一个值给checkbox

    在ASP.NET MVC开发中,需要绑定一个值给checkbox标签,如下面写法,它们运行时是没有问题,照样能跑. 看看上面的语法,在绑定时,它却出现绿浪线.提不绑定的值is not a valid ...

  7. php 删除一维数组中某一个值元素的操作方法

    1. 自己写for循环 从array里去掉$tmp这个元素的值 ? 1 2 3 4 5 6 7 8 9 10 <?php $tmp = '324'; $arr = array( '0' => ...

  8. JavaScript中函数作为值

    function myfunc() { // .. } 这是个函数,这样理解, myfunc只是外层作用域的一个变量,指向刚刚声明的function. 也就是说,function本身就是一个值, 就像 ...

  9. javascript中把一个数组的内容全部赋值给另外一个数组

    如:var a = [1,2,3,4];var b= [];b = a;这个不是把值赋值过去而是b作为a的引用,b改变的是a如何b指向的是一个新数组,a把元素值全部赋值过去? 1.普通数组可以使用   ...

随机推荐

  1. 20150414---ListView简介(web)

    ListView,自带分页功能,而且用户自定义界面样式自由度高. 如下图,都是使用Listview完成的,(测试数据,内容较乱) 所在位置:工具--数据-ListView 这里是配置ListView样 ...

  2. css3 画x图形

    .m-act-del{ right:; top:; margin-top: -6px; position: absolute; display: inline-block; width: 20px; ...

  3. 超赞值得一试的六款jQuery插件和CSS3应用

    1.jQuery图片横向滚动插件 这是一款利用jQuery实现的图片横向滚动插件,我们可以设置任意数量的图片,然后点击左右箭头按钮即可分组浏览这些图片.这款jQuery图片插件的优势有两点,其一是可以 ...

  4. extern 数组

    最近比较关注C++对象的Linkage类型,然后今天突然想起extern数组这个奇葩的东西,稍微折腾了一下,顺手写个随笔. 首先在cpp中定义几个数组: ,,,,}; ,,,,}; ,,,,}; 然后 ...

  5. Linux下安装Websphere MB所需的系统rpm包

    很少使用到Linux,这次刚好用户有一个在linux下搭建Websphere MB/MQ的任务.试了几次都不行,经过多方打听,询问原来是少了rpm包的问题,但是,具体包名不详.. --#mount / ...

  6. MSSQL优化之——查看语句执行情况

    MSSQL优化之——查看语句执行情况 在写SQL语句时,必须知道语句的执行情况才能对此作出优化.了解SQL语句的执行情况是每个写程序的人必不可少缺的能力.下面是对查询语句执行情况的方法介绍. 一.设置 ...

  7. [大牛翻译系列]Hadoop(22)附录D.2 复制连接框架

    附录D.2 复制连接框架 复制连接是map端连接,得名于它的具体实现:连接中最小的数据集将会被复制到所有的map主机节点.复制连接的实现非常直接明了.更具体的内容可以参考Chunk Lam的<H ...

  8. php随机验证码

    今天同学问我,用php怎么写验证码,由于是新手所以花了半天的时间才完成.而且功能很是简单呵呵.今天本来打算写session和cookie的看来是要明天了. <?php $image_width= ...

  9. vs2010中安装ASP.NET AJAX Control Toolkit

    方法一: 第一步 下载Ajax Control Toolkit 进入网址http://ajaxcontroltoolkit.codeplex.com/ 即可下载 第二步 解压下载下来的Ajax Con ...

  10. [Solved] install Gentoo in VBox: network interface eth0 does not exist

    ERROR:interface eth0 does not exist; ensure that you have loaded the correct kernel moudle for your ...