在JavaScript中判斷整型的N種方法
整數型別(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資料型別判斷的四種方法JavaScript資料型別
- JavaScript判斷變數型別的四種方法JavaScript變數型別
- Javascript-判斷是否為陣列的5種方法JavaScript陣列
- javascript中對變數型別的判斷方法JavaScript變數型別
- js判斷物件的幾種方法JS物件
- 判斷js中的資料型別的幾種方法JS資料型別
- javascript 判斷各種資料的型別JavaScript型別
- 判斷python字典中key是否存在的兩種方法Python
- 合併JavaScript陣列的N種方法JavaScript陣列
- Javascript 中的資料型別判斷JavaScript資料型別
- javascript中的typeof和型別判斷JavaScript型別
- 【轉】Java中判斷字串是否為數字的五種方法Java字串
- 判斷字串中只包含或不包含某種字元的方法字串字元
- 判斷是否是陣列的幾種方法陣列
- Swift 幾種動態判斷類的方法Swift
- javascript中如何判斷變數的型別?JavaScript變數型別
- JavaScript 中對變數型別的判斷JavaScript變數型別
- 判斷是否為陣列的 JavaScript 方法總結陣列JavaScript
- JS資料型別判斷的幾種方法JS資料型別
- JS常用判斷空對像的幾種方法JS
- Python 判斷質數的另一種方法Python
- JavaScript中判斷物件是否屬於Array型別的4種方法及其背後的原理與侷限性JavaScript物件型別
- JavaScript中判斷是否存在某屬性JavaScript
- 如何判斷JavaScript中的兩變數是否相等?JavaScript變數
- Javascript中判斷陣列的正確姿勢JavaScript陣列
- Python 判斷檔案是否存在的三種方法Python
- PHP 判斷陣列是否為空的幾種方法PHP陣列
- 判斷一個物件為空物件的5種方法物件
- 判斷某過程是否在執行的方法
- JS中判斷null、undefined與NaN的方法JSNullUndefinedNaN
- JavaScript 判斷閏年JavaScript
- Javascript判斷空物件JavaScript物件
- JavaScript判斷閏年JavaScript
- [譯]BigInt:JavaScript 中的任意精度整型JavaScript
- js函式中的if判斷和a==b判斷JS函式
- JavaScript 中,如何判斷兩個物件是否相等?JavaScript物件
- JavaScript 判斷物件中是否有某屬性JavaScript物件
- 我所知道的JavaScript中判斷資料型別JavaScript資料型別