在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個新函數。
