第七节: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對象下的函數,否則會被默認為window下的函數。
?
????????說了這么多,差點忘記了介紹isNaN函數本身的作用,以及它在ES6的規范下有什么不一樣的地方。
新特性:Number.isNaN函數
????????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下面的isNaN都懶得給字符串’abc’做類型轉換,直接返回false。而ES5中的isNaN函數會對字符串’abc’進行類型轉換后,發現它是一個NaN(非數值),才返回true。
????????所以我們在使用這個函數到時候還要小心,當返回false的時候,不一定就是一個數值,有可能是一個非數值類型的參數。
新特性:Number.isFinite函數??
????????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’。
?
新特性:Number.parseInt函數??
????????parseInt函數:解析一個字符串,返回一個整數。parseInt函數同樣是從window對象下移植到Number對象下,但是它的作用沒有任何變化。
? ?? ?//傳統用法:
? ?parseInt('12.3abc');?
? ?//結果:返回數值12
? ?//ES6用法:
? ?Number.parseInt('12.3abc');
? ?//結果:返回數值12
新特性:Number.parseFloat函數??
????????parseFloat函數:解析一個字符串,并返回一個浮點數。跟parseInt一樣,被移植到Number對象下,作用保持不變。
? ?? ?//傳統用法:
? ?parseInt('12.3abc');
? ?//結果:返回數值12
? ?//ES6用法:
? ?Number.parseInt('12.3abc');
? ?//結果:返回數值12
?
????????以上4個函數都是在window對象下,移植到了Number對象下,你可以能會跟我一樣好奇:好端端地為什么好移植到其他地方去,這樣做的目的是什么?
????????其實這么做的目的是慢慢地減少全局性的函數,把全局函數合理地規劃到其他對象下,漸漸實現語言的模塊化。
?
????????講完了被移植的函數,咱們來學點新增的玩意。
新特性:Number.isInteger函數??
?
????????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
????????
????????數值3.0和3.00都會被認為是整數。
極小常量
?
????????Number.EPSILON常量:定義一個極小的數值。
????????我們把這個數值打印出來看一下:
? ?console.log(Number.EPSILON);
? ?//結果:2.220446049250313e-16
????????2.220446049250313e-16是一個極小的數值,約等于0.00000000000000022204。干嘛要定義一個這樣的數值,在什么情況下會用它呢?
????????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
?
????????那么ES6給Math對象帶來哪些擴展呢?
????????ES6給Math對象新增了17個函數,我們挑選幾個常用的來講解一下。
新特性:Math.trunc函數
????????Math.trunc函數:用于去除一個數的小數部分,返回整數部分。
? ?Math.trunc(3);
? ?//結果:3
? ?Math.trunc(3.1);
? ?//結果:3
????????運行結果也很好理解,如果傳入的參數是整數,就直接返回整數,如果是小數,就去除了小數部分,返回整數部分:3。
新特性:Math.sign函數
?
????????Math.sign函數:用來判斷一個數到底是正數、負數、還是零。
? ?Math.sign(3);
? ?//結果:1
? ?Math.sign(-3);
? ?//結果:-1
? ?Math.sign(0);
? ?//結果:0
? ?Math.sign('abc');
? ?//結果:NaN
????????返回的結果類型有點多,我們分別來講解一下,參數如果是正數,結果返回1;如果是負數,結果返回-1;如果是0,結果返回0;如果是一個非數值類型的參數,結果返回:NaN。
新特性:Math.cbrt函數
????????Math.cbrt函數:用于計算一個數的立方根。
? ?Math.cbrt(8);
? ?//結果:2
? ?Math.cbrt(27);
? ?//結果:3
????
????????看以上代碼,2的立方是8,那么8作為參數,開立方根得到的值就是2,3的立方是27,那么27求立方根就得到了3,這就是Math.cbrt函數的作用。
????????除了這三個函數以外,剩下的新增函數都是一些高中時期的數學方法,只不過是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個新函數。
總結
以上是生活随笔為你收集整理的第七节:ES6为数值做了哪些扩展?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于小波变换的图像边缘检测(matlab
- 下一篇: 【流量】一觉醒来发现CSDN博客访问量增