數值的擴展
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_INTEGER
和 Number.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 的形式存儲