1. 程式人生 > >ES6 學習筆記之《數值的擴充套件》

ES6 學習筆記之《數值的擴充套件》

  1. 二進位制和八進位制表示法
    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
  1. 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;