ES6 學習筆記之《數值的擴充套件》
- 二進位制和八進位制表示法
ES6提供了兩種二進位制和八進位制的新的寫法,分別用字首0b(或0B)和0o(或0O)表示。
從ES5開始,在嚴格模式中,八進位制就不再允許使用字首0表示,ES6進一步明確,要使用字首0o表示。
// 非嚴格模式
(function(){
console.log(0o11 === 011);
})() // true
// 嚴格模式
(function(){
'use strict';
console.log(0o11 === 011);
})() // Uncaught SyntaxError: Octal literals are not allowed in strict mode.
如果要將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.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
這兩個方法與傳統的全域性方法isFinite()和isNaN()的區別在於,傳統方法先呼叫Number()將非數值的值轉為數值,然後再進行判斷。而ES6新增加的這兩個方法並沒有Number()轉換的過程,也就是說,新方法只對數值有效,而對字串及非數值型別一律返回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
- Number.parseInt() , Number.parseFloat()
ES6將全域性方法parseInt()和parseFloat(),移植到Number物件上面,行為完全保持不變。
// ES5的寫法
parseInt('12.34') // 12
parseFloat('123.45#') // 123.45
// ES6的寫法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45
這樣做的目的,是逐步減少全域性性方法,使得語言逐步模組化。
Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true
4.Number.inInteger()
Number.isInteger()用來判斷一個值是否為整數。需要注意的是,在JavaScript內部,整數和浮點數是用同樣的方式來儲存的,所以3和3.0視為同一個值。
Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false
5.Number.EPSILON
ES6在Number物件上,新增了一個極小的常量Number.EPSILON。
Number.EPSILON
// 2.220446049250313e-16
引入一個這麼小的量的目的,在於為浮點數計算,設定一個誤差範圍。我們知道浮點數計算是不精確的。
但是如果這個誤差能夠小於Number.EPSILON,我們就可以認為得到了正確結果。
0.1 + 0.2
// 0.30000000000000004
0.1 + 0.2 - 0.3
// 5.551115123125783e-17
5.551115123125783e-17 < Number.EPSILON
// true
因此,Number.EPSILON的實質是一個可以接受的誤差範圍。
function withinErrorMargin (left, right) {
return Math.abs(left - right) < Number.EPSILON;
}
withinErrorMargin(0.1 + 0.2, 0.3)
// true
withinErrorMargin(0.2 + 0.2, 0.3)
// false
上面的程式碼為浮點數運算,部署了一個誤差檢查函式。
6.Math物件的擴充套件
Math.trunc()
Math.trunc()方法用於去除一個數的小數部分,返回整數部分。
其實這個方法和Number.parseInt()效果一樣。
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內部使用Number方法將其先轉為數值。
Math.trunc('123.456')
// 123
對於空值和無法擷取整數的值,返回NaN。
Math.trunc(NaN); // NaN
Math.trunc('foo'); // NaN
Math.trunc(); // NaN
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
Math.sign('foo'); // NaN
Math.sign(); // NaN
Math.cbrt()
Math.cbrt方法用來計算一個數的立方根。
Math.cbrt(-1) // -1
Math.cbrt(0) // 0
Math.cbrt(1) // 1
Math.cbrt(2) // 1.2599210498948734
對於非數值,Math.cbrt方法內部也是先使用Number方法將其轉為數值。
Math.cbrt('8') // 2
Math.cbrt('hello') // NaN
7.指數運算子
ES7新增了一個指數運算子(**),目前Babel轉碼器已經支援咯~
2 ** 2 // 4
2 ** 3 // 8
指數運算子可以與等號結合,形成一個新的賦值運算子(**=)。
let a = 2;
a **= 2;
// 等同於 a = a * a;
let b = 3;
b **= 3;
// 等同於 b = b * b * b;