天天看點

ES6躬行記(8)——數字

一、進制

  ES6不僅完善了數字的八進制形式,還補充了一種十六進制形式,并且添加了全新的二進制形式。下面的三個變量分别表示八進制、十六進制和二進制的10,注釋中給出了該進制的另一種寫法。

var octal = 0o12,      //或0O12
  hex = 0xa,          //或0XA
  binary = 0b1010;     //或0B1010      

  注意,隻有十進制才能表示小數。

二、Number

  ES6不僅增強了Number對象處理數字的精度,還擴充了它的數字運算能力,新增的屬性和方法如表2所示。

表2  Number的屬性和方法

屬性或方法 功能描述
EPSILON 一個常量,表示1和大于1的最小值之間的內插補點:2^-52
MAX_SAFE_INTEGER 一個常量,表示JavaScript的安全整數的上限值:2^53 - 1
MIN_SAFE_INTEGER 一個常量,表示JavaScript的安全整數的下限值:-(2^53 - 1)
isFinite() 判斷一個數字是否是有限的,如果參數是NaN、Infinity、-Infinity或非數字,都将傳回false
isNaN() 判斷一個值是否是NaN,隻有當參數是NaN時,才能傳回true
isInteger() 判斷一個數字是否為整數,注意,12和12.0都被視為整數
isSafeInteger() 判斷一個數字是否為安全整數

  表中的安全整數是指處在MIN_SAFE_INTEGER和MAX_SAFE_INTEGER之間的整數。

  在全局對象中有兩個全局函數也叫isFinite()和isNaN(),但它們會先将傳入的參數轉換成數字,再進行判斷,而Number對象中的新方法卻不會執行這步類型轉換,是以新方法能得到更為準确的結果。下面會分别對新方法和全局函數傳入相同的參數,從它們的結果可知,新方法得到了期望值,而全局函數并沒有。

Number.isFinite(null);   //false
isFinite(null);          //true

Number.isNaN("abc");     //false
isNaN("abc");           //true      

三、Math

  ES6為Math對象新增了6個三角函數、4個對數方法,以及多個算術方法,具體如表3所示。

表3  Math的方法

方法 功能描述
sinh()和asinh() sinh()用于雙曲正弦;asinh()用于反雙曲正弦
cosh()和acosh() cosh()用于雙曲餘弦;acosh()用于反雙曲餘弦
tanh()和atanh() tanh()用于雙曲正切;atanh()用于反雙曲正切
expm1() 等價于Math.exp(x) - 1,可計算e^x - 1,其中x表示參數
log2() 傳回以2為底的對數,如果參數小于0,則傳回NaN
log10() 傳回以10為底的對數,如果參數小于0,則傳回NaN
log1p() 等價于Math.log(x+1),傳回一個數字加1後的自然對數,如果參數小于-1,則傳回NaN
hypot() 先将所有參數的平方相加,再計算和的平方根
cbrt() 計算數字的立方根
clz32() 先将數字轉換成32位無符号整數形式的二進制,再計算前導0的個數
trunc() 隻取數字的整數部分
imul() 讓兩個數字的32位整數相乘
fround() 将數字轉換為離它最近的單精度浮點數形式的數字
sign() 傳回數字的符号,指明數字是正數、負數還是零

  clz32()方法的描述比較抽象,現在用一個例子來講解,先将10轉換成32位的二進制,得到1010(省略了前面的28個0),再調用clz32()方法,最終的結果為28。

Math.clz32(10);        //28      

  sign()方法有5種傳回值,分别是1、-1、0、-0和NaN,代表正數、負數、正零、負零和NaN,具體如下所示。

Math.sign(2);         //1
Math.sign(-2);        //-1
Math.sign(0);         //0
Math.sign(-0);        //-0
Math.sign(NaN);       //NaN