學習ES6中的數值擴展小記

數值的擴展

1. 二進制和八進制表示法

提供了二進制和八進制數值的新寫法,分別用前綴 0b 和 0o 來進行表示,從 ES5 開始,在嚴格模式中,八進制不再允許使用前綴 0 表示
如果要使用 0b 和 0o 前綴的字符串數值轉爲十進制,需要使用 Number 方法

Number('0b111') // 7

2. Number.isFinite(),Number.isNaN()

Number.isFinite():用來檢查一個數值是否爲有限的,即不是 Infinity,當然如果參數類型不爲數值,則返回 false
Number.isNaN():用來檢查一個值是否爲 NaN,是則返回

和傳統的全局方法 isFinite()isNaN() 相比,傳統方法先調用 Number() 將非數值轉爲數值,在進行判斷,而這兩個新發放則不會進行類型的轉換。Number.isFinite() 對於非數值一律返回 false,Number.isNaN() 只有對於 NaN 才返回 true ,非 NaN 一律返回 false

3. Number.parseInt(),Number.parseFloat()

ES6將全局方法 parseInt()parseFloat() 移植到了 Number 對象上面,行爲完全保持不變。這樣做的主要目的在於,逐步減少全局性方法,使得語言逐步模塊化

4. Number.isInteger()

用來判斷一個數值是否爲整數。參數如果不爲數值,則直接返回 false

注意:
1. JavaScript 內部,整數和浮點數採用的是同樣的存儲方式,所以 25 和 25.0 被視爲同一個值,使用這個方法都會返回 true
2. JavaScript 採用 IEEE 754 標準,數值存儲爲 64 爲雙精度格式,數值精度最多可以達到 53 個二進制位(1個隱藏位和52個有效位),如果數值的精度超過這個限度,之後的位會被拋棄
3. 如果一個數值的絕對值小於 Number.MIN_VALUE(5E-324),即小於 JavaScript 能夠分辨的最小值,會被自動轉爲0,

// 小數點第16位爲2,被拋棄(轉成二進制位超過了53個二進制位)
Number.isInterger(3.0000000000000002)  // true
// 這裏的 5E-325 值太小,自動轉爲0,導致誤判
Number.isInteger(5E-324)  // false
Number.isInteger(5E-325)  // true

5. Number.EPSILON

Number 對象上面,新增一個極小的常量 Number.EPSILON,他表示 1 與大於 1 的最小浮點數之間的差。相當於 2 的 -52 次方

Number.EPSILON === Math.pow(2, -52)  // true

其存在的意義在於,表示誤差小於這個值,就可以認爲沒有意義,即不存在誤差

這就解釋的以下代碼爲什麼會返回 false

0.1.toFixed(20)  // "0.10000000000000000555"
0.1 + 0.2 === 0.3  // fale

6. 安全整數和 Number.isSafeInteger()

JavaScript 能夠準確表示的整數範圍在 -2^53 到 2^53 之間(不包含兩個端點),超過這個範圍,無法精確表示這個值

同時 ES6 引入了 Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER 這連個常量,用來表示這個範圍的上下限

Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1
// true
Number.MAX_SAFE_INTEGER === 9007199254740991
// true

Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER
// true
Number.MIN_SAFE_INTEGER === -9007199254740991

Number.isSafeInteger() 則是用來判斷整個整數是否落在這個範圍之內

這個函數的內部實現原理:
1. 先判斷參數是否爲 Number 類型
2. 之後判斷參數是否爲整數
3. 最後判斷參數是否大於或者小於安全區間

注意:實際使用這個方法時,如果參數是一條表達式,需要運算,那可能會出現一些誤差

Number.isSafeInteger(9007199254740993 - 990)
// true
9007199254740993 - 990
// 返回結果 9007199254740002
// 正確答案應該是 9007199254740003

這裏因爲這個數超過了精度範圍,導致計算機內部,以 9007199254740002 的形式存儲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章