数字的扩展(1)Number对象的扩展请参考上一篇文章
4、Math对象的扩展
4.1、去掉小数部分的Math.trunc()
Math.trunc(变量)
简单来说,如果不是number类型,或者不能隐式转换成number类型,则返回NaN;
如果可以被转化为number类型,则转换为number类型后,省略掉小数部分并返回number类型的值;
Math.trunc(1); //1
Math.trunc(1.9); //1
Math.trunc(-10.9); //-10
Math.trunc(-0); //-0,注意会保留负号
Math.trunc('-10.9'); //-10,可以识别字符串
Math.trunc(0o10); //8,可以正常识别二进制、八进制和十六进制数字
var obj = {};
obj.toString = function () {
return '+2.9';
}
Math.trunc(obj); //2,对于对象通过toString隐式转换,不会保留+号(但会保留减号)
Math.trunc('a10'); //NaN,不能被隐式转换为number
Math.trunc([1, 2]); //NaN,也不能
Math.trunc({}); //NaN,显然也不能
4.2、判定变量的正负Math.sign()
Math.sign(变量)
五种情况:
- 正数返回+1;
- 负数返回-1;
- 正0返回0;
- 负0返回-0;
- 其他返回NaN;
参数会被隐式转换为number类型再判断。示例:
Math.sign(0); //0
Math.sign(-0); //-0
Math.sign(100.1234); //1
Math.sign(-100.1234); //-1
Math.sign(Number.MIN_VALUE); //1
Math.sign(Number.MIN_VALUE / 2); //0,这个是因为已经是最小的数字了,再除以在存储的时候和0一样,于是就变成0了
var obj = {};
obj.toString = function () {
return '+2.9';
}
Math.sign(obj); //1,说明是被隐式转换过的
Math.sign('a10'); //NaN,不能被隐式转换为number
Math.sign([1, 2]); //NaN,也不能
Math.sign({}); //NaN,显然也不能
4.3、开立方Math.cbrt()
Math.cbrt(变量)
简单来说,求变量的开立方根结果。例如数字8开立方根的结果是2。
另外提一句,开平方根是Math.sqrt();
变量会被隐式转换后再计算,不符合要求的输入内容会返回NaN。
Math.cbrt(1); //1
Math.cbrt(8): //2
Math.cbrt(-8); //-2
Math.cbrt(0); //0
var obj = {};
obj.toString = function () {
return '8';
}
Math.cbrt(obj); //2,说明会被隐式转换
Math.cbrt({}); //NaN
4.4、返回一个整数二进制开头的0的数量Math.clz32()
Math.clz32()
首先,在位计算相关的函数里,只支持32位整型数的计算(见3.5,更多请谷歌百度);
其次,这个函数只对32位整型数生效;
第三,忽视小数部分;
第四,当一个32位整型数被存储时,他只会占用0~32位,而这个函数将返回未被占用的二进制的byte的数量;
第五,对于超过32位整型数的数字,固定返回32;
第六,会隐式转换为number来处理,对于依然不合法输入,返回32;
第七,左移<< 和 右移>> 位计算符,可以直接影响结果(毕竟会多占或少占一位);
第八,负数固定返回0.
Math.clz32(0); //32
Math.clz32(-0); //32
Math.clz32(-1); //0
Math.clz32(1); //31
Math.clz32(1<<1); //30
Math.clz32(4); //29
Math.clz32(4>>1); //30
Math.clz32(Math.pow(2,32)-1); //0
Math.clz32(Math.pow(2,32)); //32
Math.clz32({}); //32
Math.clz32('5'); //29
4.5、Math.imul()
Math.imul(变量1, 变量2)
按照说明:
两个数相乘,得到一个数,然后返回结果的32位整型数的部分。
alert:实际结果与预想不符,
如按 MDN 给的polyfill函数的运行结果,与chrome中的Math.imul()的运行结果不同;
差异如代码:
imul(0x7ffff,0x7ffff); //8588886017
Math.imul(0x7ffff,0x7ffff); //-1048575
524287*524287; //274876858369,但这个的值大于2的32次方-1
4.6、返回单精度浮点数Math.fround
Math.fround(变量)
4.7、返回参数平方和的平方根
Math.hypot(arguments)
参数可能存在多个;
简单来说就是每个参数先自乘获得平方,然后再将结果的和相加,然后开方即可。
注意和Math.sqrt()的结果可能所有差异(主要是因为精度问题)
Math.hypot(1); //1
Math.hypot(1,2); //2.23606797749979
Math.hypot(1,2,3); //3.741657386773941
Math.sqrt(1 +4+9); //3.7416573867739413
Math.hypot(1,2,-3) === Math.hypot(1,2,3); //true
4.8、增加了一些对数方法
略略略
Math.expm1(x)
返回ex - 1,即Math.exp(x) - 1
Math.log1p()
返回1 + x的自然对数,即Math.log(1 + x)。如果x小于-1,返回NaN。
Math.log10()
返回以10为底的x的对数。如果x小于0,则返回NaN。
Math.log2()
返回以2为底的x的对数。如果x小于0,则返回NaN
4.9、增加了一些三角函数的方法
略略略
Math.sinh(x)
返回x的双曲正弦(hyperbolic sine)
Math.cosh(x)
返回x的双曲余弦(hyperbolic cosine)
Math.tanh(x)
返回x的双曲正切(hyperbolic tangent)
Math.asinh(x)
返回x的反双曲正弦(inverse hyperbolic sine)
Math.acosh(x)
返回x的反双曲余弦(inverse hyperbolic cosine)
Math.atanh(x)
返回x的反双曲正切(inverse hyperbolic tangent)
4.10、指数运算符**
**
注,就是2个乘号连一起
简单来说:
2**3 === Math.pow(2, 3); //true
5**7 === Math.pow(5, 7); //true