ES6學習記錄5.數值的擴展

一、二進制和八進制表示法

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