ES6新增API:Number篇

forceddd發表於2021-11-19

新增的靜態屬性

ES6在Number物件上新增了一些靜態常量屬性,用於輔助計算。

  1. Number.EPSILON

    Number.EPSILON2-52)代表任意兩個數值之間的最小差值,換句話說,如果a與b的差值的絕對值小於Number.EPSILON,那麼我們就可以認為這兩個值是相等的。即:

    $$ |a-b|<Number.EPSILON \ \ \} \Longrightarrow a=b $$

    在JavaScript中,整數並不是一個單獨的型別。和我們想象的可能有些不同的是,JS中所有的數字都是雙精度浮點數。但是浮點運算只能產生近似的結果,四捨五入到最接近的整數,所以有的時候,運算的精度會是一個問題。

    console.log(0.1 + 0.2); //0.30000000000000004
    console.log(0.1 + 0.2 === 0.3);//false

    這種時候我們就可以直接使用常量Number.EPSILON來進行精度判斷了:

    function isEqual(a, b) {
        return Math.abs(a - b) < Number.EPSILON;
    }
    console.log(isEqual(0.1 + 0.2, 0.3));//true
  2. Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER

    這兩個常量Number.MAX_SAFE_INTEGER253-1)、Number.MIN_SAFE_INTEGER-253+1)和他們的名字一樣,分別代表了JS中能夠安全處理的最大整數和最小整數。

    前面已經介紹過,JS中的數字都是雙精度浮點數,而雙精度浮點數最多能表示53位精度的整數,它表示的整數範圍是 [ -253+1 , 253-1 ] 。當一個整數超出這個範圍之後,JS便不能夠再“安全”地處理這個整數了,這裡的“安全”指的是JS能夠正確地表示整數並且能夠正確地比較整數

    console.log(2 ** 53 - 1 === Number.MAX_SAFE_INTEGER);
    console.log(-(2 ** 53 - 1) === Number.MIN_SAFE_INTEGER);
    //顯然,a+1===a+2,是不符合我們的預期的。
    console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2); //true

新增的靜態函式

  1. Number.isNaN

    函式型別:

    //接收一個任意型別的可選引數,返回一個布林值結果
    (v?:any)=>boolean

    Number.isNaN是用於解決原本的全域性函式window.isNaN的缺陷的。在window.isNaN中,會先將傳入的非number型別的引數轉換為number型別,然後進行判斷,這就導致了一些在我們看來很奇怪的結果:

    //'str'轉成number型別之後得到 NaN
    console.log(isNaN('str')); //true
    //''轉成number型別之後得到0 
    console.log(isNaN('')); //false

    Number.isNaN修正了這一行為,不會將引數轉成number,所以它的執行結果可能會更符合我們的預期。

    console.log(Number.isNaN('str')); //false
    console.log(Number.isNaN('')); //false
  1. Number.isFinite

    函式型別:

    //接收一個任意型別的可選引數,返回一個布林值結果
    (v?:any)=>boolean

    Number.isFinite用於判斷傳入的引數是否是一個有窮值。它與全域性的window.isFinite的關係可以類比Number.isNaN函式與isNaN的關係:全域性的isFinite函式會將引數轉為number,而Number.isFinite不會這樣做。

    基本上,Number.isFinite(a) === (typeof a=== 'number' && isFinite(a))

    console.log(Number.isFinite(42)); //true
    console.log(isFinite(42)); //true
    console.log(Number.isFinite('42')); //false
    console.log(isFinite('42')); //true
  1. Number.isInteger

    函式型別:

    //接收一個任意型別的可選引數,返回一個布林值結果
    (v?:any)=>boolean

    因為JS中的數字都是雙精度浮點數,所以我們是沒有辦法通過型別來判斷一個數是否是整數的。ES6新增的Number.isInteger就是用於解決這個問題——判斷一個值是不是整數,的輔助函式。

    console.log(Number.isInteger('42')); //false
    console.log(Number.isInteger(42.0)); //true
    console.log(Number.isInteger(42.1)); //false
  2. Number.isSafeInteger

    Number.isSafeIntegerNumber.isInteger相比,多了一個限定範圍,也就是安全地整數範圍 [ Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER ]

相關文章