一、進制
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