数值的扩展

116 阅读3分钟

1.二进制与八进制

ES6给予二进制和八进制新的写法,为0b/0B0o/0O,而将这两者转换为十进制就需要Number()方法。

image.png

2.数值分隔符

ES2021提供了下划线'_'作为数值之间的分隔符,分割符在遵循一些前提的情况下,可以放置于任何位置。其放置限制为:

  • 不能放置于数值的开头和结尾
  • 两个分隔符不能放在一起
  • 小数点前后不能放置分隔符
  • 科学计数法的e前后不能放置分隔符
  • 若不为十进制数,则分隔符不能紧跟于进制前缀放置
  • Number(),parseInt(),parseFloat()不支持分隔符

image.png

3.Numer.isFinite(),Number.isNaN()

Number.isFinite()用来检测数据是否有限(finite),返回布尔值。若检测对象类型不是数据,则一律返回false

image.png

相应的Number.isNaN()则是用来检测对象类型是否为NaN

image.png

相对于传统的isFinite()isNaN(),改进的变得更加专一,舍去了原来数据转换的前提操作,如果不是数值或者NaN则一律返回false

4.Number.isInteger()

Number.isInteger()用来判断一个值是否为整数,返回布尔值。同样的,若判断的参数不是一个数值,则一律返回false

image.png

但是由于JS数据类型精度的问题,导致该方法判断高精度数据可能出现问题。不建议高精度数据使用该方法判断。

image.png

5.安全整数和Number.isSafeInteger()

前面说过,由于精度问题,JS数据检测可能报错。于是ES6引入了Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER这两个常量,表示在数值精确范围内的最大值和最小值。Number.isSafeInteger()则是判断一个整数是否在安全的范围内,返回布尔值。

image.png

6.Math对象的扩展

Math.trunc()//用于去除数据中的小数部分,若为非数值,则先转换再操作。空值或无法操作的值则返回NaN
Math.sign()//用于判断一个数值是正数、负数还是0,非数值同样会先转换。正数返回+1,负数返回-1,0返回+0,-0返回-0,其他返回NaN
Math.cbrt()//用于计算一个数值的平方根,同样的,非数值会先转换再操作
Math.clz32()//将数值转换为32位无符号整数形式,再返回该32位数值中有多少个0,对于小数来说,该方法只考虑整数部分
Math.imul()//该方法将两个数以32位带符号数的形式相乘,返回值也是32位的带符号整数形式,对于低位数的数值来说,该方法和*操作没有任何区别。但是对于高精度,该方法可以避免由于精度带来的误差
Math.hypot()//该方法返回所有数的平方和的平方根,对于参数,同样会先转换,再操作,若其中一个不能正确转换,则返回NaN

对数方法
Math.expm1(x)//返回e**x - 1
Math.log1p(x)//返回1 + x的自然对数
Math.log10(x)//返回以10为底的x的对数,若x<0,则返回NaN
Math.log2(x)//返回以2为底的x的对数,若x<0,则返回NaN

双曲线函数方法
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)

7.BigInt

位了解决超过一定位数的数据类型精度会精度会降低的问题,ES2020引入了BigInt(大整形)。这是一种新的数据类型,没有位数的限制,所有位数的整数都能精确显示。为了与Number区分,所有的大整形数据后面都要加上后缀n。大整形也可以用别的进制表示,但是也要加上后缀n。大整形BigInt和普通整数并不相等,他们是两种不同的值。

image.png

BigInt函数

其与Number()类似,主要作用是将参数转化成BigInt类型,两者转换规则也类似。

image.png