整数类型(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,判断整型
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]