ES6 数值

342 阅读3分钟

1. 二进制和八进制表示法

ES6提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。

0b111110111 === 503 // true
0o767 === 503 // true

2. Number.isFinite(), Number.isNaN()

Number.isFinite()判断数值是不是有限的,

Number.isNaN()判断是否是NaN

而这两个新方法只对数值有效,非数值一律返回false。

3. Number.parseInt(), Number.parseFloat()

ES6将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。

// ES6的写法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45

4. Number.isInteger()

Number.isInteger()用来判断一个值是否为整数。需要注意的是,在JavaScript内部,整数和浮点数是同样的储存方法,所以3和3.0被视为同一个值。

Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false

5. Number.EPSILON

Number.EPSILON
// 2.220446049250313e-16

Number.EPSILON可以用来描述一个可以接受的误差范围。

function withinErrorMargin (left, right) {
  return Math.abs(left - right) < Number.EPSILON;
}
withinErrorMargin(0.1 + 0.2, 0.3)
// true
withinErrorMargin(0.2 + 0.2, 0.3)
// false

6. Math.trunc()

Math.trunc()方法用于去除一个数的小数部分,返回整数部分

Math.trunc(4.1) // 4
Math.trunc(4.9) // 4
Math.trunc(-4.1) // -4
Math.trunc(-4.9) // -4
Math.trunc(-0.1234) // -0

对于非数值,Math.trunc内部使用Number方法将其先转为数值

Math.trunc('123.456')
// 123

对于空值和无法截取整数的值,返回NaN。

Math.trunc(NaN);      // NaN
Math.trunc('foo');    // NaN
Math.trunc();         // NaN

7. Math.sign()

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

参数为正数,返回+1;

参数为负数,返回-1;

参数为0,返回0;

参数为-0,返回-0;

其他值,返回NaN。

Math.sign(-5) // -1
Math.sign(5) // +1
Math.sign(0) // +0
Math.sign(-0) // -0
Math.sign(NaN) // NaN
Math.sign('foo'); // NaN
Math.sign();      // NaN

8. Math.cbrt()

求立方根,参数不是数字转为数字,非法参数返回NaN

Math.cbrt('8') // 2
Math.cbrt('hello') // NaN

9. Math.clz32()

JavaScript的整数使用32位二进制形式表示,Math.clz32方法返回一个数的32位无符号整数形式有多少个前导0。

Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1000) // 22

10. Math.imul()

Math.imul方法返回两个数以32位带符号整数形式相乘的结果,返回的也是一个32位的带符号整数。

Math.imul(2, 4)   // 8
Math.imul(-1, 8)  // -8
Math.imul(-2, -2) // 4

如果只考虑最后32位,大多数情况下,Math.imul(a, b)与a * b的结果是相同的,即该方法等同于(a * b)|0的效果(超过32位的部分溢出)。之所以需要部署这个方法,是因为JavaScript有精度限制,超过2的53次方的值无法精确表示。Math.imul方法可以返回正确的低位数值。

11. Math.fround()

Math.fround方法返回一个数的单精度浮点数形式。

Math.fround(0)     // 0
Math.fround(1)     // 1
Math.fround(1.337) // 1.3370000123977661
Math.fround(1.5)   // 1.5
Math.fround(NaN)   // NaN

12. Math.hypot()

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

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

13. 对数

//这里的=指数学的=

Math.expm1(x) = Math.exp(x) - 1 = ex - 1

Math.log1p(x) = Math.log(1 + x) = ln(1 + x)

//这里自带的Math.log(x)是自然对数lnx,对于其他底的对数,采用换底公式计算 logax = lnx / lna

Math.log10(x) = lgx

Math.log2(x) = log2x

14. 双曲函数

Math.sinh(x)

Math.cosh(x)

Math.tanh(x)

Math.asinh(x)

Math.acosh(x)

Math.atanh(x)

双曲函数有以下性质,和圆函数很相似

cosh2x - sinh2x = 1

tanhx * cothx = 1

sinh(x+y) = sinhxcoshy + coshxsinhy

cosh(x+y) = coshxcoshy + sinhxsinhy

......

15. 指数运算符

ES7新增了一个指数运算符(**),目前Babel转码器已经支持。

2 ** 2 // 4
2 ** 3 // 8

指数运算符可以与等号结合,形成一个新的赋值运算符(**=)。

let a = 2;
a **= 2;
// 等同于 a = a * a;