数值的扩展
二进制和八进制表示法
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。
需要注意isFinite和Number.isFinite的区别,以及isNumber和Number.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 // 报错