总结下es6对数值类型做了哪些改变

350 阅读4分钟

这是我参与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

参考

数值的扩展