ES6數值的擴展

1 二進制和八進制表示法
ES6提供了二進制和八進制數值的新寫法,分別用前綴0b(或0B)和0o(或0O)表示

0b111110111 === 503 // true
0o767 === 503       // true

如果將0b和0o前綴的字符串數值轉爲十進制,要使用Number方法

Number('0b111')     // 7
Number('0o10')      // 8

2 Number.isFinite(),Number.isNaN()
ES6在Number對象上,提供了Number.isFinite() 和 Number.isNaN()兩個方法。
Number.isFinite()用來檢查一個數值是否爲有限的(finite)

Number.isFinite(15);        // true
Number.isFinite(0.8);       // true
Number.isFinite(NaN);       // false
Number.isFinite(Infinity);  // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo');     // false
Number.isFinite('15');      // false
Number.isFinite(true);      // false

注意: 如果參數類型不是數值,Number.isFinite一律返回false

Number.isNaN() 用來檢查一個值是否爲NaN

Number.isNaN(NaN)       // true
Number.isNaN(15)        // false
Number.isNaN('15')      // false
Number.isNaN(true)      // false
Number.isNaN(9/NaN)     // true
Number.isNaN('true' / 0) // true
Number.isNaN('true' / 'true') // true

注意: 如果參數類型不是數值,Number.isFinite一律返回false

總結: 它們與傳統的全局方法isFinite()和isNaN()的區別在於,傳統方法先調用Number()方法將非數值轉爲數值,在進行判斷;而這兩個新方法只對數值有效,Number.isFinite()對於非數值一律返回false,Number.isNaN()只有對於NaN才返回true,非NaN一律返回false

isFinite(25)            // true
isFinite("25")          // true
Number.isFinite(25)     // true
Number.isFinite("25")   // false

isNaN(NaN)              // true
isNaN("NaN")            // true
Number.isNaN(NaN)       // true
Number.isNaN("NaN")     // false

3 Number.parseInt(),Number.parseFloat()
ES6將全局方法parseInt()和parseFloat(),移植到Number對象上面,行爲完全保持不變。

// ES6的寫法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45

目的是逐步減少全局性方法,使得語言逐步模塊化

Number.parseInt === parseInt
Number.parseFloat === parseFloat

4 Number.isInteger()
Number.isInteger()用來判斷一個數值是否爲整數

Number.isInteger(25)        // true
Number.isInteger(25.1)      // false

JavaScript內部,證書和浮點數採用的是同樣的存儲方法,所以25和25.0被視爲同一個值。

Number.isInteger(25)        // true
Number.isInteger(25.0)      // true

如果參數不是數值,Number.isInteger返回false

Number.isInteger()      // false
Number.isInteger(null)  // false
Number.isInteger('15')  // false
Number.isInteger(true)  // false

注: 如果對數據精度要求較高,不建議使用Number.isInteger()判斷一個數值是否爲整數,會照成誤判

Number.isInteger(3.0000000000000002)    // true

5 Number.EPSILON
ES6在Number對象上,新增一個極小的常量Number.EPSILON;Number.EPSILON實際上是JavaScript能夠表示的最小精度,誤差如果小於這個值,就可以認爲是不存在誤差。因爲浮點數的計算是不準確的。

0.1 + 0.2
// 0.30000000000000004

0.1 + 0.2 === 0.3           // false 

因此,Number.EPSILON的實質是一個可以接受的最小誤差範圍。以下是一個誤差檢查範圍

function withinErrorMargin (left, right) {
  return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}

0.1 + 0.2 === 0.3 // false
withinErrorMargin(0.1 + 0.2, 0.3) // true

1.1 + 1.3 === 2.4 // false
withinErrorMargin(1.1 + 1.3, 2.4) // true

6 安全整數和Number.isSafeInteger()
Javascript能夠準確表示的整數範圍在-2^53到2^53之間(不含兩個端點),超過這個範圍,無法精確表示這個值。

Math.pow(2, 53) === Math.pow(2, 53) + 1       // true

上面代碼中,超出2的53次方之後,就不準確了
ES6中引入了Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER這兩個變量,用來表示這個範圍上下限。

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

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

Number.isSafeInteger('a') // false
Number.isSafeInteger(Infinity) // false

Number.isSafeInteger(3) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER)     // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER)     // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false

7 Math對象的擴展
(1)Math.trunc方法用於去除一個數的小數部分,返回整數部分

Math.trunc(4.1) // 4
Math.trunc(4.9) // 4
Math.trunc(-4.1) // -4
Math.trunc(-4.9) // -4
Math.trunc(-0.1234) // -0

對於沒有部署這個方法的環境,可以使用下面的代碼模擬:

Math.trunc = Math.trunc || function(x) {
  return x < 0 ? Math.ceil(x) : Math.floor(x);
};

(2)Math.sign()
Math.sign方法用於就判斷 一個數到底是正數,負數,還是零。
返回五種值:
–參數爲正數,返回+1;
–參數爲負數,返回-1;
–參數爲 0,返回0;
–參數爲-0,返回-0;
–其他值,返回NaN。

Math.sign(-5)           // -1
Math.sign(5)            // +1
Math.sign(0)            // +0
Math.sign(-0)           // -0
Math.sign(NaN)          // NaN

(3)Math.cbrt()
Math.cbrt方法用於計算一個數的立方根

Math.cbrt(-1)       // -1
Math.cbrt(0)        // 0
Math.cbrt(1)        // 1
Math.cbrt(2)        // 1.2599210498948734

(3)Math.clz32()
Javascript的整數使用32位二進制表示,Math.clz32方法返回一個數的32位無符號整數形式有多少個前導0.

Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1000) // 22
Math.clz32(0b01000000000000000000000000000000) // 1
Math.clz32(0b00100000000000000000000000000000) // 2

(3)Math.imul()
Math.imul方法返回兩個數以32位帶符號整數形式相乘的結果,返回的也是一個32位的帶符號整數。

Math.imul(2, 4)   // 8
Math.imul(-1, 8)  // -8
Math.imul(-2, -2) // 4

本博客內容摘抄自
阮一峯老師寫的ECMAScript6入門一書

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