es6 number新增方法有:1、“Number.isFinite()”,可判斷指定值是否為一個有限的數(shù)值;2、“Number.isNaN()”,可檢測變量是否是一個NaN;3、“Number.parseInt()”,可將字符串轉(zhuǎn)換為整數(shù);4、“Number.parseFloat()”,可將字符串轉(zhuǎn)換為浮點(diǎn)數(shù);5、“Number.isInteger()”,可判斷值是否為整數(shù)。
前端(vue)入門到精通課程:進(jìn)入學(xué)習(xí)
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用
本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。
在 ES5 中,全局下的 isFinite () 和 isNaN () 兩種方法存在類型轉(zhuǎn)換,對最終的判斷結(jié)果存在歧義。ES6 在 Number 對象上,新提供了 Number.isFinite () 和 Number.isNaN () 兩個方法,更加健壯地進(jìn)行數(shù)值的判斷,接下來讓我看看這兩種方法。
Number.isFinite()
在 ES5 中有全局的 isFinite() 函數(shù)用來判斷被傳入的參數(shù)值是否為一個有限的數(shù)值,如果參數(shù)是字符串,會首先轉(zhuǎn)為一個數(shù)值,然后在進(jìn)行驗(yàn)證。
isFinite(Infinity); // false isFinite(NaN); // false isFinite(-Infinity); // false isFinite(0); // true isFinite(2e64); // true isFinite('2e64'); // true isFinite("0"); // true
上面的代碼可以看出,字符串也會被先轉(zhuǎn)為數(shù)值再進(jìn)行判斷,而 ES6 Number 對象上提供的 isFinite() 更健壯,和全局的 isFinite() 函數(shù)相比,這個方法不會強(qiáng)制將一個非數(shù)值的參數(shù)轉(zhuǎn)換成數(shù)值,這就意味著,只有數(shù)值類型的值,且是有窮的(finite),才返回 true。
Number.isFinite(Infinity); // false Number.isFinite(NaN); // false Number.isFinite(-Infinity); // false Number.isFinite(0); // true Number.isFinite(2e64); // true Number.isFinite('2e64'); // false Number.isFinite('0'); // false
Number.isNaN()
在 JavaScript 中與其它的值不同,NaN 不能通過相等操作符(== 和 ===)來判斷 ,因?yàn)?NaN == NaN 和 NaN === NaN 都會返回 false。 因此,判斷一個值是不是 NaN 是有必要的。
1、NaN 值的產(chǎn)生
當(dāng)算術(shù)運(yùn)算的結(jié)果返回一個未定義的或無法表示的值時,NaN 就產(chǎn)生了。但是,NaN 并不一定用于表示某些值超出表示范圍的情況。
-
將某些非數(shù)值強(qiáng)制轉(zhuǎn)換為數(shù)值的時候,會得到 NaN。
-
0 除以 0 會返回 NaN —— 但是其他數(shù)除以 0 則不會返回 NaN。
我們知道可以使用 Number() 方法進(jìn)行類型轉(zhuǎn)換,下面列舉被強(qiáng)制類型轉(zhuǎn)換為 NaN 的例子:
Number(undefined) // NaN Number('undefined') // NaN Number('string') // NaN Number({}) // NaN Number('10,3') // NaN Number('123ABC') // NaN Number(new Date().toString()) // NaN
上面的例子可以看出,很多值在強(qiáng)制類型轉(zhuǎn)換下轉(zhuǎn)為 NaN,針對這樣的值去進(jìn)行判斷無疑是有問題的,下面我們來看下 isNaN () 的問題。
2、isNaN () 的問題
默認(rèn)情況全局下存在方法 isNaN () 用了判斷是否為 NaN 值,它要求接收的是數(shù)值類型的參數(shù),但是當(dāng)參數(shù)不是 Number 類型, isNaN 函數(shù)會首先嘗試將這個參數(shù)轉(zhuǎn)換為數(shù)值,然后才會對轉(zhuǎn)換后的結(jié)果是否是 NaN 進(jìn)行判斷。
實(shí)例:
isNaN(NaN); // true isNaN(undefined); // true isNaN('undefined')// true isNaN({}); // true isNaN(true); // false isNaN(null); // false isNaN(37); // false // strings isNaN("37"); // false: 可以被轉(zhuǎn)換成數(shù)值37 isNaN("37.37"); // false: 可以被轉(zhuǎn)換成數(shù)值37.37 isNaN("37,5"); // true isNaN('123ABC'); // true: parseInt("123ABC")的結(jié)果是 123, 但是Number("123ABC")結(jié)果是 NaN isNaN(""); // false: 空字符串被轉(zhuǎn)換成0 isNaN(" "); // false: 包含空格的字符串被轉(zhuǎn)換成0 // dates isNaN(new Date()); // false isNaN(new Date().toString()); // true isNaN("imooc") // true: "blabla"不能轉(zhuǎn)換成數(shù)值 // 轉(zhuǎn)換成數(shù)值失敗, 返回NaN
結(jié)合上面 NaN 是如何產(chǎn)生的例子的結(jié)果可以看出,使用 isNaN 來判斷返回的是 true,這顯然不是我們想要的結(jié)果。針對這樣的問題,ES6 做了修補(bǔ),下面我們看 ES6 中的 isNaN 方法。
3、Number.isNaN () 詳情
ES6 提供了 Number.isNaN(x) ,通過這個方法來檢測變量 x 是否是一個 NaN 將會是一種可靠的做法,它不會對所判斷的值進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
Number.isNaN(NaN); // true Number.isNaN(Number.NaN); // true Number.isNaN(0 / 0) // true // 下面這幾個如果使用全局的 isNaN() 時,會返回 true。 Number.isNaN("NaN"); // false,字符串 "NaN" 不會被隱式轉(zhuǎn)換成數(shù)字 NaN。 Number.isNaN(undefined); // false Number.isNaN('undefined');// false Number.isNaN({}); // false Number.isNaN("blabla"); // false Number.isNaN(true); // false Number.isNaN(null); // false Number.isNaN(37); // false Number.isNaN("37"); // false Number.isNaN("37.37"); // false Number.isNaN(""); // false Number.isNaN(" "); // false
通過上面的實(shí)例,基本覆蓋了現(xiàn)有程序的所有情況,不會出現(xiàn)使用全局下的 isNaN() 多帶來的問題。所有推薦使用 Number.isNaN(x) 方式來判斷是否是 NaN。在不支持 Number.isNaN 函數(shù)情況下,可以通過表達(dá)式 (x != x) 來檢測變量 x 是不是 NaN 會更加可靠。
Number.parseInt()&Number.parseFloat()
為了保持方法上的統(tǒng)一,把全局下的 parseInt() 和 parseFloat() 移植到 ES6 的 Number 對象上。
ES6 的 Number 對象上提供的 Number.isFinite () 和 Number.isNaN () 兩個函數(shù)是相同的,如何證明 Number 下的這兩個方法只是移植全局的呢?可以利用 === 運(yùn)算符來判斷,如下實(shí)例:
Number.parseInt === parseInt; // true Number.parseFloat === parseFloat; // true
上面的代碼返回的結(jié)果都為 ture 說明此兩種函數(shù)和全局是一樣的,沒有發(fā)生變化。具體的使用方法可以參考 ES5 中的 parseInt() 和 parseFloat() 函數(shù)。
// ES5的寫法 parseInt('12.34') // 12 parseFloat('123.45#') // 123.45 // ES6的寫法 Number.parseInt('12.34') // 12 Number.parseFloat('123.45#') // 123.45
將這兩個全局方法移植到 Number 對象上,為了逐步減少全局性方法,使語言逐步模塊化。
Number.isInteger()
在學(xué)習(xí)這個函數(shù)之前,我們先來回顧一下,我們是怎么判斷一個值為整數(shù)的?
1、判斷一個值為整數(shù)
一種方法是:任何整數(shù)都會被 1 整除,即余數(shù)是 0。利用這個規(guī)則來判斷是否是整數(shù)。就有如下函數(shù):
function isInteger(value) { return typeof value === 'number' && value%1 === 0; } isInteger(5) // true isInteger(5.5) // false isInteger('') // false isInteger('8') // false isInteger(true) // false isInteger([]) // false
另一種方法是:使用 Math.round、Math.ceil、Math.floor 判斷,因?yàn)檎麛?shù)取整后還是等于自己。利用這個特性來判斷是否是整數(shù),使用 Math.floor 示例,如下:
function isInteger(value) { return Math.floor(value) === value; } isInteger(5) // true isInteger(5.5) // false isInteger('') // false isInteger('8') // false isInteger(true) // false isInteger([]) // false
上面的兩種方法算是比較常用的判斷方式,其他的一些方式都存在一些問題,這里就不一一列舉了。但是,這兩種方法都不夠簡潔,ES6 把判斷整數(shù)提升到了語言層面,下面我們來看下 Number.isInteger() 的使用。
2、Number.isInteger () 的用法
Number.isInteger() 是 ES6 新增的函數(shù),用來判斷給定的參數(shù)是否為整數(shù)。
Number.isInteger(25) // true Number.isInteger(25.1) // false
如果被檢測的值是整數(shù),則返回 true,否則返回 false。注意 NaN 和正負(fù) Infinity 不是整數(shù)。
Number.isInteger(0); // true Number.isInteger(1); // true Number.isInteger(-100000); // true Number.isInteger(0.8); // false Number.isInteger(Math.PI); // false Number.isInteger(Infinity); // false Number.isInteger(-Infinity); // false Number.isInteger("100"); // false Number.isInteger(true); // false Number.isInteger(false); // false Number.isInteger([1]); // false
上面的代碼基本涵蓋了 JavaScript 中的值的判斷,在一些不支持 ES6 語法的瀏覽器中可以使用上面的兩種方式進(jìn)行 Polyfill 處理。
Number.isSafeInteger()
Number.isSafeInteger() 是 ES6 新增的函數(shù),用來判斷傳入的參數(shù)值是否是一個 “安全整數(shù)”(safe integer)在數(shù)值擴(kuò)展的 小節(jié) 我們介紹了最大安全整數(shù)和最小安全整數(shù),不記得的同學(xué)可以跳過去看看。
一個安全整數(shù)是一個符合下面條件的整數(shù):
-
可以準(zhǔn)確地表示為一個 IEEE-754 雙精度數(shù)字;
-
其 IEEE-754 表示不能是舍入任何其他整數(shù)以適應(yīng) IEEE-754 表示的結(jié)果。
比如,2e53 – 1 是一個安全整數(shù),它能被精確表示,在任何 IEEE-754 舍入模式(rounding mode)下,沒有其他整數(shù)舍入結(jié)果為該整數(shù)。作為對比,2e53 就不是一個安全整數(shù),它能夠使用 IEEE-754 表示,但是 2e53 + 1 不能使用 IEEE-754 直接表示,在就近舍入(round-to-nearest)和向零舍入中,會被舍入為 2e53。
安全整數(shù)范圍為 -(2e53 – 1)到 2e53 – 1 之間的整數(shù),包含 -(2e53 – 1)和 2e53 – 1。
Number.isSafeInteger(3); // true Number.isSafeInteger(Math.pow(2, 53)) // false Number.isSafeInteger(Math.pow(2, 53) - 1) // true Number.isSafeInteger(NaN); // false Number.isSafeInteger(Infinity); // false Number.isSafeInteger("3"); // false Number.isSafeInteger(3.1); // false Number.isSafeInteger(3.0); // true
【