ECMAScript 6(10)——数字的扩展(2)Math对象的扩展

来源:互联网 发布:制作图片软件 编辑:程序博客网 时间:2024/06/10 22:21

数字的扩展(1)Number对象的扩展请参考上一篇文章

4、Math对象的扩展

4.1、去掉小数部分的Math.trunc()

Math.trunc(变量)

简单来说,如果不是number类型,或者不能隐式转换成number类型,则返回NaN;
如果可以被转化为number类型,则转换为number类型后,省略掉小数部分并返回number类型的值;

Math.trunc(1);    //1Math.trunc(1.9);    //1Math.trunc(-10.9);    //-10Math.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,不能被隐式转换为numberMath.trunc([1, 2]);    //NaN,也不能Math.trunc({});    //NaN,显然也不能

4.2、判定变量的正负Math.sign()

Math.sign(变量)

五种情况:

  1. 正数返回+1;
  2. 负数返回-1;
  3. 正0返回0;
  4. 负0返回-0;
  5. 其他返回NaN;

参数会被隐式转换为number类型再判断。示例:

Math.sign(0);    //0Math.sign(-0);    //-0Math.sign(100.1234);    //1Math.sign(-100.1234);    //-1Math.sign(Number.MIN_VALUE);    //1Math.sign(Number.MIN_VALUE / 2);    //0,这个是因为已经是最小的数字了,再除以在存储的时候和0一样,于是就变成0了var obj = {};obj.toString = function () {    return '+2.9';}Math.sign(obj);    //1,说明是被隐式转换过的Math.sign('a10');    //NaN,不能被隐式转换为numberMath.sign([1, 2]);    //NaN,也不能Math.sign({});    //NaN,显然也不能

4.3、开立方Math.cbrt()

Math.cbrt(变量)

简单来说,求变量的开立方根结果。例如数字8开立方根的结果是2。

另外提一句,开平方根是Math.sqrt();

变量会被隐式转换后再计算,不符合要求的输入内容会返回NaN。

Math.cbrt(1);    //1Math.cbrt(8):    //2Math.cbrt(-8);    //-2Math.cbrt(0);    //0var 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);    //32Math.clz32(-0);    //32Math.clz32(-1);    //0Math.clz32(1);    //31Math.clz32(1<<1);    //30Math.clz32(4);    //29Math.clz32(4>>1);    //30Math.clz32(Math.pow(2,32)-1);    //0Math.clz32(Math.pow(2,32));    //32Math.clz32({});    //32Math.clz32('5');    //29

4.5、Math.imul()

Math.imul(变量1, 变量2)

按照说明:

两个数相乘,得到一个数,然后返回结果的32位整型数的部分。

alert:实际结果与预想不符,

如按 MDN 给的polyfill函数的运行结果,与chrome中的Math.imul()的运行结果不同;

差异如代码:

imul(0x7ffff,0x7ffff);    //8588886017Math.imul(0x7ffff,0x7ffff);    //-1048575524287*524287;    //274876858369,但这个的值大于2的32次方-1

4.6、返回单精度浮点数Math.fround

Math.fround(变量)

4.7、返回参数平方和的平方根

Math.hypot(arguments)

参数可能存在多个;

简单来说就是每个参数先自乘获得平方,然后再将结果的和相加,然后开方即可。

注意和Math.sqrt()的结果可能所有差异(主要是因为精度问题)

Math.hypot(1);    //1Math.hypot(1,2);    //2.23606797749979Math.hypot(1,2,3);    //3.741657386773941Math.sqrt(1 +4+9);    //3.7416573867739413Math.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);    //true5**7 === Math.pow(5, 7);    //true
0 0
原创粉丝点击