在javascript中檢查一個值是否為integer


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM