这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战
问题
面试官: 你能讲讲es6对数值类型做了哪些改进吗?
面试者: 可以,增加了二级制和八进制的前缀定义,同时也增加了数值分隔符,看起来更语义化。同时还增加了Number上一些方法。
面试官:不错不错,Number上哪些方法,可以罗列几个吗?
面试者:这个可能记得不是很清楚。。
以上场景纯属个人虚构,可能会有雷同。
今天来总结下es6对数值类型做了哪些改变。
数值类型
进制
现在针对二进制,八进制,十六进制都有固定的前缀来表示。
二进制0b(或者0B), 八进制0o(或者0O),十六进制0x(或者0X)。
console.log(0b11) // 3
console.log(0o11) // 9
console.log(0x11) // 17
如果想表示非十进制以外的进制,请务必使用前缀表示。
分隔符
js之前是没有分隔符的,如果数字很长的话,可读性很差,比如:
12341243543554
64352341243543
现在es新增了数值分隔符,使用_表示。
12_341_243_543_554 // 12万亿
64_3523_4124_3543 // 64万亿
console.log(typeof 64_3523_4124_3543) // number
console.log(64352341243543 === 64_3523_4124_3543) // true
可读性会好一点点,它本质上还是数字
使用它会有以下限制:
- 前后需要有数字
- 前后直接跟着小数点
- 科学计数法,e的前后不能有分隔符
- 不要在
Number,parseInt,parseFloat函数上使用分隔符
_123_ // error
1._23 // error
1e_123 // error
Number('123_123') //NaN
parseInt('123_123') // 123
新增方法
之前在全局上有isFinite方法,isNaN方法,parseInt方法,parseFloat方法,现在在Number对象下也新加了这些方法。
Number.isFinite(arg): 判断参数是不是有限的,是则返回true。 如果参数不是数字,则统统返回false。
console.log(Number.isFinite(123)) // true
console.log(Number.isFinite(Infinity)) // false
console.log(Number.isFinite('123')) // false
console.log(Number.isFinite(true)) // false
Number.isNaN(arg): 判断参数是不是NaN,是则返回true。
console.log(Number.isNaN(NaN)) // true
console.log(Number.isNaN(1)) // false
console.log(Number.isNaN('123')) // false
console.log(Number.isNaN(true)) // false
传统的全局方法会对参数转成number类型再判断,而Number对象下这两个方法不会转,只要不是number类型,一律返回false。
Number.parseInt(): 把参数转成整数,如果有小数,舍弃小数部分。
console.log(Number.parseInt(1.4)) // 1
console.log(Number.parseInt('1.6')) // 1
console.log(Number.parseInt('aaa')) // NaN
Number.parseFloat(): 把参数转成浮点数,如果有小数,保留小数部分。
console.log(Number.parseFloat(1.4)) // 1.4
console.log(Number.parseFloat('1.6')) // 1.6
console.log(Number.parseFloat('aaa')) // NaN
这两个方法和全局的行为完全一致。
其它
还新增了以下方法和属性:
Number.isInteger(): 判断参数是否为整数。 但是小数部分是.0的也会认为是整数。 不是数字的会返回false。
Number.isInteger(1) // true
Number.isInteger(1.0) // true
Number.isInteger(1.1) // false
Number.isInteger(null) // false
因为js目前十进制最大位数是16位,转为二进制最大位数是53位,如果超过位数则会被忽略。
// 小数点的4转成二进制超出53位,被忽略了
console.log(3.000000000000000004) // 3
console.log(Number.isInteger(3.000000000000000004)) // true
Number.EPSILON:表示的是安全整数范围内整数和整数的最小浮点数的最小差,也就是最小准确精度。
console.log(Number.EPSILON) // 2.220446049250313e-16
Number.EPSILON === Math.pow(2, -52) // true
区别于Number.MIN_VALUE, 它是代表着js最小的精度,最接近于0的正数。
Number.MIN_VALUE // 5e-324
Number.MAX_SAFE_INTEGER:表示的是最大安全整数。
Number.MIN_SAFE_INTEGER:表示的是最小安全整数。
Number.isSafeInteger():判断参数是否为安全整数。是则返回true。
Number.MAX_SAFE_INTEGER // 9007199254740991
Number.MIN_SAFE_INTEGER // -9007199254740991
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 // true
console.log(Number.isSafeInteger(9007199254740991)) // true
console.log(Number.isSafeInteger(9007199254740992)) // false
console.log(Number.isSafeInteger(-9007199254740991)) // true
console.log(Number.isSafeInteger(-9007199254740992)) // false