【重学前端】ECMAScript6 - 数值的扩展

103 阅读3分钟

数值的扩展

二进制和八进制表示法

ES6新增了二进制和八进制。用0b加数字表示二进制,0o加数字表示八进制。

下面统计下js中常见的进制表示和进制之间的转换。

常见进制

  • 二进制(Binary):0b11(或0B)
  • 八进制(Octal):0o11(或0O)
  • 十进制(Decimal):11
  • 十六进制(Hexadecimal): 0x11(或0X)

进制转换

其他进制转成十进制

  • parseInt(str, radix),使用方法如下:
如果str不加前缀,且没有传递radix,则默认是十进制;
如果str加了前缀,且没有传递radix,则通过前缀来判断是由什么进制转成十进制,如果前缀是0x,能够识别出是16进制,如果前缀是0o或者0b,识别不了,得到0;
如果str不加前缀,且传递了radix,radix表示数值原来的进制,将该进制转成十进制;
如果str加了前缀,且传递了radix,会进行将前缀转成对应的进制的数之后再转换,如果前缀中的字母不是正常的可以转换的字母,得到0
parseInt('10') // 10
parseInt('10', 2) // 2
parseInt('0b10') // 0
parseInt('0o10') // 0
parseInt('0x10') // 16
parseInt('0b10', 16) // 2832, b在16进制中是11,11 * 16 * 16 + 16 * 1 = 2832
  • Number()
Number('0b10') // 2
Number('0o10') // 8
  • +(一元运算符)
+'0x10' // 16

十进制转成其他进制

Number.prototype.tostring(radix),使用方法如下:

传入radix,表示需要将十进制转成对应进制
(2).toString(2) // '10'
(8).toString(8) // '10' 
(16).toString(16) // '10'

由上可知,如果我们将一个十进制数转换成其他进制再转换回来的话,需要如下:

parseInt((十进制数).toString(其他进制), 其他进制)

数值分隔符

数值分隔符_,只要记住只能在数字与数字之间放一个,数量没有限制,主要作用是为了增强可读性,主打一个花瓶作用。

123_4_56_789 === 123456789 // true

Number.isFinite(), Number.isNaN()

Number.isFinite判断一个数值是否有限,如果不是数值,都返回false,如果数值是Infinity-Infinity,也返回false,其余有限数值返回true。

Number.isNaN判断一个值是否是NaN,是则返回true,其余都返回false。 需要注意isFiniteNumber.isFinite的区别,以及isNumberNumber.isNumber的区别。前者会先调用Number()将非数值转为数值,再进行判断,后者只对数值有效。

isFinite(25) // true
isFinite("25") // true
Number.isFinite(25) // true
Number.isFinite("25") // false

isNaN(NaN) // true
isNaN("NaN") // true
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false
Number.isNaN(1) // false

Number.EPSILON

一个非常小的常量

Number.EPSILON === Math.pow(2, -52) // true
// 2.220446049250313e-16

Number.EPSILON可以用来设置能够接受的误差范围。众所周知,由于IEEE754标准,有时候计算一些值时存在误差,如果我们判定在误差范围内,计算值则认为相等,那我们就可以用到这个常量。

Math对象的扩展

Math.trunc

用于去除一个数的小数部分,返回整数部分。对于非数值,内部先调用Number()将其转成数值。

Math.trunc('12.34') // 12
Math.trunc(true) //1
Math.trunc('hello');    // NaN

polyfill如下:

Math.trunc = Math.trunc || function(x) {
  return x < 0 ? Math.ceil(x) : Math.floor(x);
};

其余可能会用到的如下:

  • Math.sign(x):判断一个数x是正数、负数、还是零。
  • Math.cbrt(x): 求一个数x的立方根。
  • Math.log10(x): 返回以10为底的x的对数。
  • Math.log2(x): 返回以2为底的x的对数。

BigInt数据类型

新增的数据类型,大整数(注意是整数)。格式为整数后面加个n,如果是bigint类型,在做加减乘除时,另一个数也需要时bigint类型。

typeof 123n // 'bigint'
BigInt(123) // 123n
1n + 2n // 3n
1n / 2n // 0n
1n / 2 // 报错

参考