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