一、二進制和八進制表示法
ES6 提供了二進制和八進制數值的新的寫法,分別用前綴0b(或0B)
和0o(或0O)
表示。
0b111110111 === 503 // true
0o767 === 503 // true
如果要將0b和0o前綴的字符串數值轉爲十進制
,要使用Number方法
Number('0b111') // 7
Number('0o10') // 8
二、Number.isFinite(), Number.isNaN()
Number.isFinite()
用來檢查一個數值是否爲有限的(finite),即不是Infinity。
Number.isNaN()
用來檢查一個值是否爲NaN
它們與傳統的全局方法isFinite()和isNaN()的區別在於,傳統方法先調用Number()將非數值的值轉爲數值,再進行判斷,
而這兩個新方法只對數值有效,Number.isFinite()對於非數值一律返回false, Number.isNaN()只有對於NaN才返回true,非NaN一律返回false
三、Number.parseInt(), Number.parseFloat()
ES6 將全局方法parseInt()
和parseFloat()
,移植到Number對象上面,行爲完全保持不變。
Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true
這樣做的目的,是逐步減少全局性方法,使得語言逐步模塊化\
四、Number.isInteger()
Number.isInteger()
用來判斷一個數值是否爲整數
數值存儲爲64位雙精度格式,數值精度最多可以達到 53 個二進制位(1 個隱藏位與 52 個有效位)
,否則會誤判,如下:
Number.isInteger(3.0000000000000002) // true
解釋:
這個小數的精度達到了小數點後16個十進制位,轉成二進制位超過了53個二進制位,導致最後的那個2被丟棄了。
Number.MIN_VALUE(5E-324)
,即 JavaScript 能夠分辨的最小值,小於這個值,會誤判
Number.isInteger(5E-324) // false
Number.isInteger(5E-325) // true
5E-325由於值太小,會被自動轉爲0,因此返回true
如果對數據精度的要求較高,不建議使用Number.isInteger()判斷一個數值是否爲整數
五、Number.EPSILON
ES6 在Number對象上面,新增一個極小的常量Number.EPSILON。根據規格,它表示 1 與大於 1 的最小浮點數之間的差。
對於 64 位浮點數來說,大於 1 的最小浮點數相當於二進制的1.00…001,小數點後面有連續 51 個零。這個值減去 1 之後,就等於 2 的 -52 次方
。
Number.EPSILON === Math.pow(2, -52)
// true
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON.toFixed(20)
// "0.00000000000000022204"
Number.EPSILON實際上是 JavaScript 能夠表示的最小精度。誤差如果小於這個值,就可以認爲已經沒有意義了,即不存在誤差了。
引入一個這麼小的量的目的,在於爲浮點數計算,設置一個誤差範圍。我們知道浮點數計算是不精確的。
0.1 + 0.2
// 0.30000000000000004
0.1 + 0.2 - 0.3
// 5.551115123125783e-17
5.551115123125783e-17.toFixed(20)
// '0.00000000000000005551'
0.1 + 0.2 === 0.3 // false
Number.EPSILON可以用來設置“能夠接受的誤差範圍
”。比如,誤差範圍設爲 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果兩個浮點數的差小於這個值,我們就認爲這兩個浮點數相等
5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2)
// true
六、Math 對象的擴展
Math.trunc
方法用於去除一個數的小數部分,返回整數部分
Math.sign
方法用來判斷一個數到底是正數、負數、還是零。對於非數值,會先將其轉換爲數值
Math.cbrt()
方法用於計算一個數的立方根
Math.clz32()
方法將參數轉爲 32 位無符號整數的形式,然後返回這個 32 位值裏面有多少個前導 0。
Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1000) // 22
Math.clz32(0b01000000000000000000000000000000) // 1
Math.clz32(0b00100000000000000000000000000000) // 2
Math.imul()
方法返回兩個數以 32 位帶符號整數形式相乘的結果,返回的也是一個 32 位的帶符號整數
Math.fround
方法返回一個數的32位單精度浮點數形式
Math.hypot
方法返回所有參數的平方和的平方根。
七、對數方法
(1) Math.expm1() :Math.expm1(x)返回 ex - 1,即Math.exp(x) - 1
(2)Math.log1p() :Math.log1p(x)方法返回1 + x的自然對數,即Math.log(1 + x)。如果x小於-1,返回NaN。
(3)Math.log10() : Math.log10(x)返回以 10 爲底的x的對數。如果x小於 0,則返回 NaN
(4)Math.log2():Math.log2(x)返回以 2 爲底的x的對數。如果x小於 0,則返回 NaN。
八、指數運算符
2 ** 2 // 4
2 ** 3 // 8
let a = 1.5;
a **= 2;
// 等同於 a = a * a;
let b = 4;
b **= 3;
// 等同於 b = b * b * b;
注意,V8 引擎的指數運算符與Math.pow的實現不相同,對於特別大的運算結果,兩者會有細微的差異。
Math.pow(99, 99)
// 3.697296376497263e+197
99 ** 99
// 3.697296376497268e+197