Math的扩展

Math.trunc()

Math.trunc 用于除去一个数的小数部分。

1
2
3
4
5
6
7
8
9
10
11
Math.trunc(111.22) //111
Math.trunc("123.456") //123
//对空和无法截取整数的值,返回 NaN
Math.trunc(NaN) //NaN

//代码模拟
Math.trunc =
Math.trunc ||
function (x) {
return x < 0 ? Math.ceil(x) : Math.floor(x)
}

Math.sign()

Math.sign 用于判断一个数到底是正数、负数、还是零。

  • 参数为正数,返回+1
  • 参数为负数,返回-1
  • 参数为 0,返回 0
  • 参数为-0,返回-0
  • 其他值,返回 NaN
1
2
3
4
5
6
7
8
9
10
//代码模拟
Math.sign =
Math.sign ||
function (x) {
x = +x //convert to a number
if (x === 0 || isNaN(x)) {
return x
}
return x > 0 ? 1 : -1
}

Math.cbrt()

Math.cbrt 用于计算一个数的立方根,对于非数值,内部也是先使用 Number 方法转换为数值。

1
2
3
4
5
6
7
//代码模拟
Math.cbrt =
Math.cbrt ||
function (x) {
var y = Math.pow(Math.abs(x), 1 / 3)
return x < 0 ? -y : y
}

Math.clz32()

Math.clz32 返回一个数的 32 位无符号整数形式有多少个前导 0.

1
2
3
4
5
Math.clz32(0) //32
Math.clz32(1) //31
Math.clz32(0b01000000000000000000000000000000) //1

Math.clz32(1 << 1) //30

对于小数,Math.clz32()只考虑整数部分

1
Math.clz32(3.9) //30

Math.imul()

Math.imul 返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位带符号整数。
对于很大数的乘法,低位数值往往是不精确的,Math.imul()方法可以正确的返回低位数值。

Math.fround()

Math.fround 方法返回一个数的单精度浮点数形式。
对于整数来说,Math.fround()方法的返回结果不会有任何不同,区别主要在于那些无法用 64 个二进制位精确表示的小数。这时,Math.fround()方法会返回最接近这个小数的单精度浮点数。

1
2
3
4
5
6
//代码模拟
Math.fround =
Math.fround ||
function (x) {
return new Float32Array([x])[0]
}

Math.hypot()

Math.hypot 方法返回所有参数的平方和的平方根。

1
Math.hypot(3, 4) //5

Math.expm1()

Math.expm1(x)返回$e^x-1$, 即 Math.exp(x) - 1;

1
2
3
4
5
6
//代码模拟
Math.expm1 =
Math.expm1 ||
function (x) {
return Math.exp(x) - 1
}

Math.log1p()

Math.log1p(x)返回$ln(1+x)$,即 Math.log(1 + x)。如果 x 小于-1,则返回 NaN。

1
2
3
4
5
6
//代码模拟
Math.log1p =
Math.log1p ||
function (x) {
return Math.log(1 + x)
}

Math.log10()

Math.log10(x)返回$log_{10}(x)$,如果 x 小于 0,返回 NaN。

1
2
3
4
5
6
//代码模拟
Math.log10 =
Math.log10 ||
function (x) {
return Math.log(x) / Math.LN10
}

Math.log2()

Math.log2(x)返回$log_2(x)$,如果 x 小于 0,返回 NaN。

1
2
3
4
5
6
//代码模拟
Math.log2 =
Math.log2 ||
function (x) {
return Math.log(x) / Math.LN2
}

双曲函数方法

ES6 新增了六个双曲函数方法

  • Math.sinh(x) 返回 $sinh\ x=\frac{e^x-e^{-x}}{2}$
  • Math.cosh(x) 返回 $cosh\ x=\frac{e^x+e^{-x}}{2}$
  • Math.tanh(x) 返回 $tanh\ x=\frac{sinh\ x}{cosh\ x}=\frac{e^x-e^{-x}}{e^x+e^{-x}}$
  • Math.asinh(x) 返回 $arsinh\ x=ln(x+\sqrt[\ ]{x^2+1})$
  • Math.acosh(x) 返回 $arsinh\ x=ln(x+\sqrt[\ ]{x^2-1})$
  • Math.atanh(x) 返回 $artanh\ x=\frac{1}{2}ln\frac{1+x}{1-x}$

Math.sign()

Math.sign 用来判断一个数的正负,如果参数是-0,会返回-0。

指数运算符**

1
2
3
4
5
2 ** 2 //4
3 ** 3 //27

let a = 1.5
a **= 3 //a = a _ a _ a;

**在 V8 引擎中,指数运算符与 Math.pow 的实现不相同,对于特别大的运算结果,两者会有差异**