1. 程式人生 > >ES6隨筆--各數據類型的擴展(2)--數值

ES6隨筆--各數據類型的擴展(2)--數值

結果 math sin 形式 整數 所有 數值轉換 math.h 很大的

ES6隨筆--各數據類型的擴展(2)--數值

二進制和八進制表示

二進制0b(或0B)表示;八進制0o(或0O)表示;

這兩種字符串轉換成十進制數值,使用Number()方法;

Number(‘0b111‘)  // 7

Number.isFinite(), Number.isNaN();

Number.isFinite()的參數如果不是數值,一律返回false, Infinity/-Infinity/NaN都返回false

Number.isNaN()對不是NaN的參數一律返回false;

這兩個方法與傳統全局方法相比沒有進行數值轉換,對於非數值參數一律返回false

Number.parseInt(), Number.parseFloat();

與原來的全局方法行為相同,這樣做是為了減少全局方法,逐步模塊化;

Number.isInteger()

判斷一個參數是否為整數,如果數據要求精度較高,可能會不準確;

Number.EPSILON

表示1與大於1的最小浮點數之間的差值(常量);實際上是JS能夠表示的最小精度;

Number.EPSILON === Math.pow(2, -52)

可以用來設置“可以接受的誤差範圍”。

安全整數和Number.isSafeInteger()

JS能夠精確表示的整數範圍在Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER之間;這個範圍內是“安全的”,否則就會“不安全”,檢驗方法為Number.isSafeInteger()

但是對於一個運算,則要對運算數和結果都檢驗,全部在安全整數範圍內結果才是可信的。

Math對象的擴展

1) Math.trunc() 去除小數部分,保留整數部分,相當於

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

非數值會先轉換為數值,不能截取數值或空值,返回NaN;

2) Math.sign():確認一個參數是正數、負數還是零;非數值會先轉換為數值;無法轉換則返回NaN;相當於

Math.sign = Math.sign || function(x) {
  x = +x; // convert to a number
  if (x === 0 || isNaN(x)) {
    return x;
  }
  return x > 0 ? 1 : -1;
};

返回值包括+1,-1, 0, -0, NaN;

3) Nath.cbrt(): 計算一個數的立方根;相當於

Math.cbrt = Math.cbrt || function(x) {
  var y = Math.pow(Math.abs(x), 1/3);
  return x < 0 ? -y : y;
};

4) Math.clz32(),返回一個數的32位無符號整數形式有多少前導零;對空值或其他類型值會先轉換為數值再計算;

5) Math.imul(),返回兩個數以 32 位帶符號整數形式相乘的結果,返回的也是一個 32位的帶符號整數;對於那些很大的數的乘法,低位數值往往都是不精確的,Math.imul方法可以返回正確的低位數值.

Math.imul(0x7fffffff, 0x7fffffff) // 1

6) Math.fround(), 返回一個數的32位單精度浮點數形式。

7) Math.hypot(), 返回所有參數的平方和的平方根。

4個對數方法:

8) Math.expm1(), 返回Math.exp(x)-1

9) Math.log1p(), 返回1+x的自然對數;

10) Math.log10(), 返回以10為底的x的對數,如果x小於0,則返回NaN;

11) Math.log2(), 返回以2為底的x的對數,如果x小於0,則返回NaN;

6個雙曲函數方法;

指數運算符(**):對於特別大的運算結果,與Math.pow()結果會有細微差異;與等號連用,作為新的賦值符:

a **= 2  // a = a ** 2; a = a * a;
b **= 3  // b = b ** 3; b = b * b * b;

ES6隨筆--各數據類型的擴展(2)--數值