二进制和八进制表示法
在ES5中,使用前缀0
表示八进制,利用toString(2)
方法将数值转换为二进制。在ES6中,提供了二进制和八进制数值的新写法,分别用0b(或0B)
和0o(或0O)
来表示。
0b111110111 === 503 // true
0o767 === 503 // true
要将0b
或0o
前缀的字符串数值转换为十进制,可以使用Number
方法
Number('0b111') // 7
Number('0o10') // 8
Number.isFinite() 和 Number.isNaN()
ES6新增了Number.isFinite()
和 Number.isNaN()
方法分别用于检测一个数值是否为有限的以及是否为NaN。
Number.isFinite(0.8); //true
Number.isFinite(Infinite); //false
Number.isFinite('15'); //false
Number.isNaN(NaN); //true
Number.isNaN(15); //false
Number.isNaN(9/NaN); //true
Number.isNaN('15'); //false
与传统的isFinite()
和isNaN()
方法区别在于,新方法不会先调用Number()
将非数值转换为数值,再进行判断。因此新方法只读数值有效,对于非数值一律返回false。
Number.parseInt() 和 Number.parseFloat()
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。
Number.isInteger()
Number.isInteger()
判断一个值是否为整数,在js中,整数和浮点数都是同样的存储方法,因此3和3.0返回的值都是true
,该方法只对数值有效,非数值一律为false。
Number.isInteger(25); //true
Number.isInteger(25.0); //true
Number.EPSILON
ES6 在Number
对象上面,新增一个极小的常量Number.EPSILON
。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。实际上其是 JavaScript 能够表示的最小精度,引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。
Number.EPSILON === Math.pow(2, -52)
// true
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON
可以用来设置“能够接受的误差范围”,即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。
安全整数和Number.isSafeInteger()
JavaScript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),这是在JS中,所有数字都用64位双精度浮点数存储,其由1符号位,11位指数和52位尾数位组成。其中尾数部分按照IEEE754标准被省略了一个最高位1,因此实际上精度为53位。http://blog.jobbole.com/74199/
ES6 引入了Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
这两个常量,用来表示安全整数范围的上下限
Number.isSafeInteger()
则是用来判断一个整数是否落在这个范围之内
Number.isSafeInteger(Infinity) // false
Number.isSafeInteger(9007199254740992) // false
Number.isSafeInteger(1.2) // false
Number.isSafeInteger('a') // false
Number.isSafeInteger(9007199254740990) // true
实际使用这个函数时,需要注意。验证运算结果是否落在安全整数的范围内,不要只验证运算结果,而要同时验证参与运算的每个值,因为非安全整数可能经过运算后得到错误结果,而该错误结果可能是一个安全整数
Math对象的扩展
Math.trunc()
Math.trunc
方法用于去除一个数的小数部分,返回整数部分。对于非数值,Math.trunc
内部使用Number
方法将其先转为数值,对于空值和无法截取整数的值,返回NaN
。
Math.trunc(4.1); //4
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('9'); //+1
Math.sign('a'); //NaN
Math.cbrt()
Math.cbrt
方法用于计算一个数的立方根。对于非数值,Math.cbrt
方法内部也是先使用Number
方法将其转为数值,不能转换,则返回NaN
Math.cbrt(8); //2
Math.clz32()
JavaScript 的数值都以64位格式存储,但位操作符并不直接操作64位的值,而是先将64位转为32位的整数,然后执行操作,最后再将结果转换为64位。对于开发人员来说,整个过程就像只存在32位整数一样。Math.clz32
方法返回一个数的 32 位无符号整数形式有多少个前导 0。对于小数,Math.clz32
方法只考虑整数部分。对于空值或其他类型的值,Math.clz32
方法会将它们先转为数值,然后再计算
Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1000) // 22
Math.clz32(0b01000000000000000000000000000000) // 1
Math.clz32(0b00100000000000000000000000000000) // 2
左移运算符(<<
)与Math.clz32
方法直接相关
ath.clz32(1) // 31
Math.clz32(1 << 1) // 30
Math.clz32(1 << 2) // 29
Math.clz32(1 << 29) // 2
Math.imul()
Math.imul方法返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数
Math.imul(2, 4) // 8
Math.imul(-1, 8) // -8
在32位情况下,大多数情况Math.imul(a, b)
与a * b
的结果是相同的。但当超过JS的表达安全整数范围后,普通运算的结果往往不精确,Math.imul
方法可以返回正确的低位数值。
Math.imul(0x7fffffff, 0x7fffffff) // 1
Math.fround()
Math.fround方法返回一个数的32位单精度浮点数形式(1个符号位,8个指数,23个尾数)。所以对于 -2^24 至 2^24 之间的整数(不含两个端点),返回结果与参数本身一致。如果参数的绝对值大于 2^24,返回的结果便开始丢失精度。
对于 NaN
和 Infinity,此方法返回原值。对于其它类型的非数值,Math.fround 方法会先将其转为数值,再返回单精度浮点数
该方法主要作是将64位双精度浮点数转为32位单精度浮点数,如果小数的精度超过24位,返回值就会出现差异,否则不变。
// 未丢失有效精度
Math.fround(1.125) // 1.125
Math.fround(7.25) // 7.25
// 丢失精度
Math.fround(0.3) // 0.30000001192092896
Math.fround(0.7) // 0.699999988079071
Math.fround(1.0000000123) // 1
Math.hypot()
Math.hypot
方法返回所有参数的平方和的平方根。如果参数不是数值,Math.hypot
方法会将其转为数值。只要有一个参数无法转为数值,就会返回 NaN
Math.hypot(3,4); //5
Math.hypot(3, 4, 5); // 7.0710678118654755
Math.expm1()、Math.log1p()、Math.log10()和Math.log2()
ES6新增了4个对数方法
(1) Math.expm1()
Math.expm1(x)
返回 e^x - 1,即Math.exp(x) - 1
(2) Math.log1p()
Math.log1p(x)
返回In(x+1),即Math.log(1+x)
(3)Math.log10()
Math.log10(x)
返回以 10 为底的x的对数。如果x小于 0,则返回 NaN
(4)Math.log2()
Math.log2(x)
返回以 2 为底的x的对数。如果x小于 0,则返回 NaN。
双曲函数方法
ES6新增了6个双曲函数方法
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)
指数运算符
ES6新增了指数运算符(**
),其可以与等号结合,形成一个新的赋值运算符(**=
)
2**2 //4
2**3 //8
let a=1.5;
a **= 2;