ES6学习笔记5 数值的扩展

二进制和八进制表示法

在ES5中,使用前缀0表示八进制,利用toString(2)方法将数值转换为二进制。在ES6中,提供了二进制和八进制数值的新写法,分别用0b(或0B)0o(或0O)来表示。

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

要将0b0o前缀的字符串数值转换为十进制,可以使用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_INTEGERNumber.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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值