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