第七节:ES6为数值做了哪些扩展?
????????上一節(jié)和大家學(xué)習(xí)了字符串的擴(kuò)展,這一節(jié)輪到了數(shù)值,我們一起來學(xué)習(xí)數(shù)值的擴(kuò)展。
????????這幾天公眾號(hào)都收到了很多同學(xué)問,什么時(shí)候出下一節(jié),大家的期待和學(xué)習(xí)熱情如此高漲,前端君也不會(huì)怠慢,繼續(xù)更新。劇透一下,這一節(jié)并不會(huì)很燒腦,都是介紹類的知識(shí)講解,理解性的東西不多,初學(xué)者們也可以愉快地看完。
傳統(tǒng)的寫法
?
????????在介紹數(shù)值的擴(kuò)展之前我們來看看舊的規(guī)范和使用方式,有對(duì)比才能看出不同之處。
????????在ES5中,我們存在幾個(gè)全局函數(shù) isNaN函數(shù),isFinite函數(shù),parseInt函數(shù),parseFloat函數(shù)等,對(duì)于這些全局函數(shù)的使用很簡(jiǎn)單,就拿isNaN函數(shù)來舉例。
ES5中的寫法是:
? ?? ?isNaN(2.5);? //結(jié)果:false
? ?window.isNaN(2.5);//結(jié)果:false
????????以上兩種寫法均可,isNaN是全局函數(shù),本身就是屬于window對(duì)象下的一個(gè)方法,所以大部分人會(huì)使用第一種寫法。
????????但是在ES6的標(biāo)準(zhǔn)中,isNaN方法被移植到了Number對(duì)象上,也就是原本屬于全局對(duì)象window下的函數(shù),現(xiàn)在屬于Number對(duì)象上了,同樣被處理的函數(shù)還有isFinite函數(shù),parseInt函數(shù),parseFloat函數(shù)。
被移植后的函數(shù)使用方式是這樣的:
? ?? ?Number.isNaN(2.5); //結(jié)果:false
????????在使用之前必須指明它是Number對(duì)象下的函數(shù),否則會(huì)被默認(rèn)為window下的函數(shù)。
?
????????說了這么多,差點(diǎn)忘記了介紹isNaN函數(shù)本身的作用,以及它在ES6的規(guī)范下有什么不一樣的地方。
新特性:Number.isNaN函數(shù)
????????Number.isNaN函數(shù):用于判斷傳入的是否是非數(shù)值,注意:是判斷非數(shù)值,而不是判斷數(shù)值,IsNaN的全稱是: is not a number。
????????使用方式上面已經(jīng)演示過,但為了加深印象,再展示多一次:
? ?? ?Number.isNaN(2.5); //結(jié)果:false
????????由于2.5是一個(gè)number類型的數(shù)值,所以返回false(再次注意:判斷是非數(shù)值,所以是false,表示2.5是一個(gè)數(shù)值類型的值)。
????????那么,移植到Number對(duì)象isNaN函數(shù)和原本是全局函數(shù)的isNaN函數(shù),有不一樣的地方嗎,還是僅僅簡(jiǎn)單地移植過來就完事了?
????????答案:有區(qū)別。
????????傳統(tǒng)的isNaN函數(shù)會(huì)把非數(shù)值的參數(shù)轉(zhuǎn)化成數(shù)值再進(jìn)行判斷,而Number. isNaN只對(duì)數(shù)值類型有效,非數(shù)值類型的參數(shù)一律返回false。看文字解釋不過癮,咱們看案例。
? ?? ?isNaN('abc');//結(jié)果:true
? ?//'abc'無法轉(zhuǎn)為一個(gè)數(shù)值,返回true
? ?Number.isNaN('abc'); //結(jié)果:false
? ?//'abc'是字符串,Number.isNaN不做類型轉(zhuǎn)換,直接返回false
????????正如上面我寫的注釋一樣,Number下面的isNaN都懶得給字符串’abc’做類型轉(zhuǎn)換,直接返回false。而ES5中的isNaN函數(shù)會(huì)對(duì)字符串’abc’進(jìn)行類型轉(zhuǎn)換后,發(fā)現(xiàn)它是一個(gè)NaN(非數(shù)值),才返回true。
????????所以我們?cè)谑褂眠@個(gè)函數(shù)到時(shí)候還要小心,當(dāng)返回false的時(shí)候,不一定就是一個(gè)數(shù)值,有可能是一個(gè)非數(shù)值類型的參數(shù)。
新特性:Number.isFinite函數(shù)??
????????Number.isFinite函數(shù):用來檢查一個(gè)數(shù)值是否非無窮。注意是判斷非無窮,不是判斷無窮,這里跟isNaN函數(shù)一樣,有點(diǎn)繞。
? ?? ?Number.isFinite(1);
? ?//結(jié)果:true,數(shù)值1是有窮,即非無窮
? ?Number.isFinite(Infinity);
? ?//結(jié)果:false,Infinity表示無窮大的特殊值
????
????????注意第二行代碼的參數(shù):Infinity,Infinity是window對(duì)象下的一個(gè)常量,表示一個(gè)無窮數(shù)。所以第二行代碼會(huì)返回false。此外,isFinite函數(shù)跟isNaN函數(shù)一樣,也只是對(duì)數(shù)值類型有效,對(duì)非數(shù)值類型的參數(shù)一律返回false。
? ?? ?Number.isFinite('abc'); //結(jié)果:false
????????所以同樣要注意,當(dāng)Number.isFinite函數(shù)返回false的時(shí)候,參數(shù)不一定就是一個(gè)有窮的數(shù)值類型,也有可能是一個(gè)非數(shù)值類型的參數(shù)。如:字符串’abc’。
?
新特性:Number.parseInt函數(shù)??
????????parseInt函數(shù):解析一個(gè)字符串,返回一個(gè)整數(shù)。parseInt函數(shù)同樣是從window對(duì)象下移植到Number對(duì)象下,但是它的作用沒有任何變化。
? ?? ?//傳統(tǒng)用法:
? ?parseInt('12.3abc');?
? ?//結(jié)果:返回?cái)?shù)值12
? ?//ES6用法:
? ?Number.parseInt('12.3abc');
? ?//結(jié)果:返回?cái)?shù)值12
新特性:Number.parseFloat函數(shù)??
????????parseFloat函數(shù):解析一個(gè)字符串,并返回一個(gè)浮點(diǎn)數(shù)。跟parseInt一樣,被移植到Number對(duì)象下,作用保持不變。
? ?? ?//傳統(tǒng)用法:
? ?parseInt('12.3abc');
? ?//結(jié)果:返回?cái)?shù)值12
? ?//ES6用法:
? ?Number.parseInt('12.3abc');
? ?//結(jié)果:返回?cái)?shù)值12
?
????????以上4個(gè)函數(shù)都是在window對(duì)象下,移植到了Number對(duì)象下,你可以能會(huì)跟我一樣好奇:好端端地為什么好移植到其他地方去,這樣做的目的是什么?
????????其實(shí)這么做的目的是慢慢地減少全局性的函數(shù),把全局函數(shù)合理地規(guī)劃到其他對(duì)象下,漸漸實(shí)現(xiàn)語言的模塊化。
?
????????講完了被移植的函數(shù),咱們來學(xué)點(diǎn)新增的玩意。
新特性:Number.isInteger函數(shù)??
?
????????Number.isInteger函數(shù):用來判斷是否是整數(shù)。
? ?Number.isInteger(3.2);
? ?//結(jié)果:false
? ?Number.isInteger(3);
? ?//結(jié)果:true
????????上面的運(yùn)行結(jié)果也如我們所料,數(shù)值3.2不是整數(shù),返回false。不過有一點(diǎn)要注意:在javascript內(nèi)部對(duì)整數(shù)和浮點(diǎn)數(shù)采用一樣的存儲(chǔ)方式,因此小數(shù)點(diǎn)后如果都是0的浮點(diǎn)數(shù),都會(huì)被認(rèn)為是整數(shù)。看個(gè)例子就知道了:
? ?Number.isInteger(3.0);
? ?//結(jié)果:true
? ?Number.isInteger(3.00);
? ?//結(jié)果:true
????????
????????數(shù)值3.0和3.00都會(huì)被認(rèn)為是整數(shù)。
極小常量
?
????????Number.EPSILON常量:定義一個(gè)極小的數(shù)值。
????????我們把這個(gè)數(shù)值打印出來看一下:
? ?console.log(Number.EPSILON);
? ?//結(jié)果:2.220446049250313e-16
????????2.220446049250313e-16是一個(gè)極小的數(shù)值,約等于0.00000000000000022204。干嘛要定義一個(gè)這樣的數(shù)值,在什么情況下會(huì)用它呢?
????????Number.EPSILON的出現(xiàn)是用來判斷浮點(diǎn)數(shù)的計(jì)算誤差,如果浮點(diǎn)數(shù)計(jì)算得到的誤差不超過Number.EPSILON的值,就表示可以接受這樣的誤差。
安全整數(shù)
????????ES6為我們引入了安全整數(shù)的概念。什么?整數(shù)還有安全和不安全的說法?原來JavaScript能夠準(zhǔn)確表示的整數(shù)范圍在-2^53到2^53之間,超過這個(gè)范圍,無法精確表示這個(gè)值。故稱之為不安全。
????????為此,ES6定義了兩個(gè)常量來表示這個(gè)范圍的最大值和最小值:Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER。此外,如果給你一個(gè)數(shù)值,你不知道它是否超出了這個(gè)安全范圍,你可以使用ES6給我們新增的一個(gè)函數(shù)Number.isSafeInteger來進(jìn)行判斷。看例子:
? ?Number.isSafeInteger(Number.MAX_SAFE_INTEGER);
? ?//結(jié)果:true
? ?Number.isSafeInteger(Number.MAX_SAFE_INTEGER+1);
? ?//結(jié)果:false
????????我們用最大安全整數(shù)Number.MAX_SAFE_INTEGER來做試驗(yàn),第一行代碼的結(jié)果返回的值是true,也就表示Number.MAX_SAFE_INTEGER屬于安全范圍,第二行代碼,我們對(duì)Number.MAX_SAFE_INTEGER進(jìn)行了+1,相加后的數(shù)值超過安全范圍,isSafeInteger函數(shù)就返回了false,表示不在安全范圍內(nèi)。
?
????????ES6給數(shù)值帶來的擴(kuò)展,除了對(duì)Number對(duì)象進(jìn)行了擴(kuò)展,還對(duì)Math對(duì)象進(jìn)行了擴(kuò)展。對(duì)于Math對(duì)象大家應(yīng)該不會(huì)感到陌生,我們平時(shí)用的求隨機(jī)數(shù)的方法random就是屬于Math對(duì)象下的方法。
????????有必要回顧一下:
? ?? ?Math.random();
? ?//結(jié)果:隨機(jī)數(shù)0.8897368770341108
?
????????那么ES6給Math對(duì)象帶來哪些擴(kuò)展呢?
????????ES6給Math對(duì)象新增了17個(gè)函數(shù),我們挑選幾個(gè)常用的來講解一下。
新特性:Math.trunc函數(shù)
????????Math.trunc函數(shù):用于去除一個(gè)數(shù)的小數(shù)部分,返回整數(shù)部分。
? ?Math.trunc(3);
? ?//結(jié)果:3
? ?Math.trunc(3.1);
? ?//結(jié)果:3
????????運(yùn)行結(jié)果也很好理解,如果傳入的參數(shù)是整數(shù),就直接返回整數(shù),如果是小數(shù),就去除了小數(shù)部分,返回整數(shù)部分:3。
新特性:Math.sign函數(shù)
?
????????Math.sign函數(shù):用來判斷一個(gè)數(shù)到底是正數(shù)、負(fù)數(shù)、還是零。
? ?Math.sign(3);
? ?//結(jié)果:1
? ?Math.sign(-3);
? ?//結(jié)果:-1
? ?Math.sign(0);
? ?//結(jié)果:0
? ?Math.sign('abc');
? ?//結(jié)果:NaN
????????返回的結(jié)果類型有點(diǎn)多,我們分別來講解一下,參數(shù)如果是正數(shù),結(jié)果返回1;如果是負(fù)數(shù),結(jié)果返回-1;如果是0,結(jié)果返回0;如果是一個(gè)非數(shù)值類型的參數(shù),結(jié)果返回:NaN。
新特性:Math.cbrt函數(shù)
????????Math.cbrt函數(shù):用于計(jì)算一個(gè)數(shù)的立方根。
? ?Math.cbrt(8);
? ?//結(jié)果:2
? ?Math.cbrt(27);
? ?//結(jié)果:3
????
????????看以上代碼,2的立方是8,那么8作為參數(shù),開立方根得到的值就是2,3的立方是27,那么27求立方根就得到了3,這就是Math.cbrt函數(shù)的作用。
????????除了這三個(gè)函數(shù)以外,剩下的新增函數(shù)都是一些高中時(shí)期的數(shù)學(xué)方法,只不過是ES6將他們的運(yùn)算封裝成一個(gè)方法,方便大家使用,也算是開發(fā)者的福音。
它們分別是:
Math.acosh(x) 返回 x 的反雙曲余弦。
Math.asinh(x) 返回 x 的反雙曲正弦。
Math.atanh(x) 返回 x 的反雙曲正切。
Math.clz32(x) 返回 x 的 32 位二進(jìn)制整數(shù)表示形式的前導(dǎo) 0 的個(gè)數(shù)。
Math.sinh(x) 返回x的雙曲正弦。
Math.cosh(x) 返回 x 的雙曲余弦。
Math.expm1(x) 返回 e?x - 1。
Math.fround(x) 返回 x 的單精度浮點(diǎn)數(shù)形式。
Math.hypot(...values) 返回所有參數(shù)的平方和的平方根。
Math.imul(x, y) 返回兩個(gè)參數(shù)以 32 位整數(shù)形式相乘的結(jié)果。
Math.log1p(x) 返回 1 + x 的自然對(duì)數(shù)。
Math.log10(x) 返回以 10 為底的x的對(duì)數(shù)。
Math.log2(x) 返回以 2 為底的 x 的對(duì)數(shù)。
Math.tanh(x) 返回 x 的雙曲正切。
????????這么多數(shù)學(xué)方法,估計(jì)很多人都會(huì)懵逼,根本記不住這么多,但是沒關(guān)系,我們也不需要去死記硬背它們,我們只需要記住ES6為Math對(duì)象擴(kuò)展了很多數(shù)學(xué)方法就可以了。等真正使用到的時(shí)候,我們?cè)偃ゲ檎屹Y料就可以了。
?
本節(jié)總結(jié)
總結(jié):ES6對(duì)Number對(duì)象新增了isInteger函數(shù)、極小常量Number.EPSILON、安全整數(shù);還將window對(duì)象下的4個(gè)函數(shù)移植到了Number對(duì)象下;此外,對(duì)Math對(duì)象擴(kuò)展了17個(gè)新函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的第七节:ES6为数值做了哪些扩展?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于小波变换的图像边缘检测(matlab
- 下一篇: 【流量】一觉醒来发现CSDN博客访问量增