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_INTEGER
和Number.MAX_SAFE_INTEGER
之间;这个范围内是“安全的”,否则就会“不安全”,检验方法为Number.isSafeInteger()
;
但是对于一个运算,则要对运算数和结果都检验,全部在安全整数范围内结果才是可信的。
Math对象的扩展
Math.trunc()
去除小数部分,保留整数部分,相当于
Math.trunc = Math.trunc || function(x) {
return x < 0 ? Math.ceil(x) : Math.floor(x);
};
非数值会先转换为数值,不能截取数值或空值,返回NaN
;
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
;
Nath.cbrt()
: 计算一个数的立方根;相当于
Math.cbrt = Math.cbrt || function(x) {
var y = Math.pow(Math.abs(x), 1/3);
return x < 0 ? -y : y;
};
-
Math.clz32()
,返回一个数的32位无符号整数形式有多少前导零;对空值或其他类型值会先转换为数值再计算; -
Math.imul()
,返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32位的带符号整数;对于那些很大的数的乘法,低位数值往往都是不精确的,Math.imul方法可以返回正确的低位数值.
Math.imul(0x7fffffff, 0x7fffffff) // 1
-
Math.fround()
, 返回一个数的32位单精度浮点数形式。 -
Math.hypot()
, 返回所有参数的平方和的平方根。
4个对数方法:
-
Math.expm1()
, 返回Math.exp(x)-1
; -
Math.log1p()
, 返回1+x
的自然对数; -
Math.log10()
, 返回以10
为底的x
的对数,如果x
小于0,则返回NaN
; -
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;