ES6 數值的擴展


在ES5中,我們存在幾個全局函數 isNaN函數,isFinite函數,parseInt函數,parseFloat函數等,對於這些全局函數的使用很簡單,就拿isNaN函數來舉例。

ES5中的寫法是:

    isNaN(2.5);  //結果:false
    window.isNaN(2.5);//結果:false

 以上兩種寫法均可,isNaN是全局函數,本身就是屬於window對象下的一個方法,所以大部分人會使用第一種寫法。

        但是在ES6的標准中,isNaN方法被移植到了Number對象上,也就是原本屬於全局對象window下的函數,現在屬於Number對象上了,同樣被處理的函數還有isFinite函數,parseInt函數,parseFloat函數。

被移植后的函數使用方式是這樣的:

    Number.isNaN(2.5); //結果:false

  Number.isNaN函數:用於判斷傳入的是否是非數值,注意:是判斷非數值,而不是判斷數值,IsNaN的全稱是: is not a number。

Number.isNaN(2.5); //結果:false

 由於2.5是一個number類型的數值,所以返回false(再次注意:判斷是非數值,所以是false,表示2.5是一個數值類型的值)。

那么,移植到Number對象isNaN函數和原本是全局函數的isNaN函數,有不一樣的地方嗎,還是僅僅簡單地移植過來就完事了?

        答案:有區別。

        傳統的isNaN函數會把非數值的參數轉化成數值再進行判斷,而Number. isNaN只對數值類型有效,非數值類型的參數一律返回false。看文字解釋不過癮,咱們看案例。

    isNaN('abc');//結果:true
    //'abc'無法轉為一個數值,返回true

    Number.isNaN('abc'); //結果:false
    //'abc'是字符串,Number.isNaN不做類型轉換,直接返回false

Number.isFinite函數:用來檢查一個數值是否非無窮。注意是判斷非無窮,不是判斷無窮,這里跟isNaN函數一樣,有點繞。

 Number.isFinite(1);
    //結果:true,數值1是有窮,即非無窮

    Number.isFinite(Infinity);
    //結果:false,Infinity表示無窮大的特殊值

 注意第二行代碼的參數:Infinity,Infinity是window對象下的一個常量,表示一個無窮數。所以第二行代碼會返回false。此外,isFinite函數跟isNaN函數一樣,也只是對數值類型有效,對非數值類型的參數一律返回false。

Number.isFinite('abc'); //結果:false

 所以同樣要注意,當Number.isFinite函數返回false的時候,參數不一定就是一個有窮的數值類型,也有可能是一個非數值類型的參數。如:字符串’abc’。

 parseInt函數:解析一個字符串,返回一個整數。parseInt函數同樣是從window對象下移植到Number對象下,但是它的作用沒有任何變化。

    //傳統用法:
    parseInt('12.3abc');  
    //結果:返回數值12

    //ES6用法:
    Number.parseInt('12.3abc');
    //結果:返回數值12

  parseFloat函數:解析一個字符串,並返回一個浮點數。跟parseInt一樣,被移植到Number對象下,作用保持不變。

    //傳統用法:
    parseInt('12.3abc');
    //結果:返回數值12

    //ES6用法:
    Number.parseInt('12.3abc');
    //結果:返回數值12

  Number.isInteger函數:用來判斷是否是整數。

    Number.isInteger(3.2);
    //結果:false

    Number.isInteger(3);
    //結果:true

上面的運行結果也如我們所料,數值3.2不是整數,返回false。不過有一點要注意:在javascript內部對整數和浮點數采用一樣的存儲方式,因此小數點后如果都是0的浮點數,都會被認為是整數。看個例子就知道了:

    Number.isInteger(3.0);
    //結果:true

    Number.isInteger(3.00);
    //結果:true

  Number.EPSILON常量:定義一個極小的數值。

  console.log(Number.EPSILON);
    //結果:2.220446049250313e-16

     Number.EPSILON的出現是用來判斷浮點數的計算誤差,如果浮點數計算得到的誤差不超過Number.EPSILON的值,就表示可以接受這樣的誤差。

 

ES6為我們引入了安全整數的概念。什么?整數還有安全和不安全的說法?原來JavaScript能夠准確表示的整數范圍在-2^53到2^53之間,超過這個范圍,無法精確表示這個值。故稱之為不安全。

 

        為此,ES6定義了兩個常量來表示這個范圍的最大值和最小值:Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER。此外,如果給你一個數值,你不知道它是否超出了這個安全范圍,你可以使用ES6給我們新增的一個函數Number.isSafeInteger來進行判斷。看例子:

    Number.isSafeInteger(Number.MAX_SAFE_INTEGER);
    //結果:true

    Number.isSafeInteger(Number.MAX_SAFE_INTEGER+1);
    //結果:false

        我們用最大安全整數Number.MAX_SAFE_INTEGER來做試驗,第一行代碼的結果返回的值是true,也就表示Number.MAX_SAFE_INTEGER屬於安全范圍,第二行代碼,我們對Number.MAX_SAFE_INTEGER進行了+1,相加后的數值超過安全范圍,isSafeInteger函數就返回了false,表示不在安全范圍內。

 

        ES6給數值帶來的擴展,除了對Number對象進行了擴展,還對Math對象進行了擴展。對於Math對象大家應該不會感到陌生,我們平時用的求隨機數的方法random就是屬於Math對象下的方法

    Math.random();
    //結果:隨機數0.8897368770341108

  Math.trunc函數:用於去除一個數的小數部分,返回整數部分。

    Math.trunc(3);
    //結果:3

    Math.trunc(3.1);
    //結果:3

Math.sign函數:用來判斷一個數到底是正數、負數、還是零。

    Math.sign(3);
    //結果:1

    Math.sign(-3);
    //結果:-1

    Math.sign(0);
    //結果:0

    Math.sign('abc');
    //結果:NaN

 Math.cbrt函數:用於計算一個數的立方根。

    Math.cbrt(8);
    //結果:2

    Math.cbrt(27);
    //結果:3

 

 

  除了這三個函數以外,剩下的新增函數都是一些高中時期的數學方法,只不過是ES6將他們的運算封裝成一個方法,方便大家使用,也算是開發者的福音。

 

它們分別是:

Math.acosh(x) 返回 x 的反雙曲余弦。

Math.asinh(x) 返回 x 的反雙曲正弦。

Math.atanh(x) 返回 x 的反雙曲正切。

Math.clz32(x) 返回 x 的 32 位二進制整數表示形式的前導 0 的個數。

Math.sinh(x) 返回x的雙曲正弦。

Math.cosh(x) 返回 x 的雙曲余弦。

Math.expm1(x) 返回 eˆx - 1。

Math.fround(x) 返回 x 的單精度浮點數形式。

Math.hypot(...values) 返回所有參數的平方和的平方根。

Math.imul(x, y) 返回兩個參數以 32 位整數形式相乘的結果。

Math.log1p(x) 返回 1 + x 的自然對數。

Math.log10(x) 返回以 10 為底的x的對數。

Math.log2(x) 返回以 2 為底的 x 的對數。

Math.tanh(x) 返回 x 的雙曲正切。

 

        這么多數學方法,估計很多人都會懵逼,根本記不住這么多,但是沒關系,我們也不需要去死記硬背它們,我們只需要記住ES6為Math對象擴展了很多數學方法就可以了。等真正使用到的時候,我們再去查找資料就可以了。

總結:ES6對Number對象新增了isInteger函數、極小常量Number.EPSILON、安全整數;還將window對象下的4個函數移植到了Number對象下;此外,對Math對象擴展了17個新函數。


免責聲明!

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



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