前提概要
上一篇编写的是ES6中的RegExp的y修饰符和u修饰符,链接:juejin.cn/post/702138… , 这次写的是ES6中数值的扩展,这次介绍ES6中数值的部分基础知识,其他的知识点以后再慢慢补充。如有不对的或者不准确的地方,欢迎大家提出😄,我也积极修改。最近因为自己的私事耽误了半个月,没有发文章。下边开始正文:
二进制(0B)与八进制(0O)
在ES5中如何把十进制转换为二进制呢?
const a = 5 // 101
console.log(a.toString(2)) // 101
如何把二进制转换为十进制呢?
const b = 101
console.log(parseInt(b, 2)) // 5
parseInt()
第一个作用是可以取整parseInt(5.5),第二个作用是可以进行进制的转换,第二个参数表示的转换成几进制parseInt(b,2)
ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。
const a = 0B0101
console.log(a) // 5
const b = 0O123
console.log(b) // 83
新增方法
Number.isFinite()
用来检查一个数值是否为有限的(finite),即不是Infinity
console.log(Number.isFinite(5)) // true
console.log(Number.isFinite(2.5)) // true
console.log(Number.isFinite(Infinity)) // false
console.log(Number.isFinite('Infinity')) // false
console.log(Number.isFinite('foo')) // false
console.log(Number.isFinite(true)) // false
console.log(Number.isFinite(null)) // false
console.log(Number.isFinite(undefined)) // false
Number.isNaN()
用来检查一个值是否为NaN
console.log(Number.isNaN(NaN)) // true
console.log(Number.isNaN(15)) // false
console.log(Number.isNaN('15')) // false
console.log(Number.isNaN(true)) // false
console.log(Number.isNaN(9 / NaN)) // true
console.log(Number.isNaN('true' / 0)) // true
console.log(Number.isNaN('true' / 'true')) // true
Number.parseInt()
ES6 将全局方法parseInt()移植到Number对象上面,行为完全保持不变。 这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。
// ES5的写法
console.log(parseInt('1.23')) // 1
// ES6的写法
console.log(Number.parseInt('1.23')) // 1
Number.parseFloat()
ES6 将全局方法parseFloat()移植到Number对象上面,行为完全保持不变。这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。
// ES5的写法
console.log(parseFloat('1.23')) // 1.23
// ES6的写法
console.log(Number.parseFloat('1.23')) // 1.23
Number.isInteger()
用来判断一个数值是否为整数。
console.log(Number.isInteger(25)) // true
console.log(Number.isInteger(25.1)) // false
console.log(Number.isInteger()) // false
console.log(Number.isInteger(null)) // false
console.log(Number.isInteger('15')) // false
console.log(Number.isInteger(true)) // false
注意:
引出0.1 + 0.2 != 0.3? js中为什么不等与0.3
这个是数字精度的问题,我们需要了解数字在计算机当中是如何存储和运算的。
数字是以二进制数进行存储的,它以IEEE754这个双精度标准来存储的。在js当中的存储空间是17位数的,当超出存储空间后面的书就会被舍弃掉
由于0.1转换为一个二进制数:0.000110011....,所以0.1在存储的时候是一个近似值,它会有精度的缺失,所以说在0.1+0.2的时候并不等于0.3
Number.MAX_SAFE_INTEGER
2的53次方是JS当中最大的数,因此,就会有一个最大的安全整数这么个概念
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 // true
Number.MAX_SAFE_INTEGER === 9007199254740991 // true
Number.MIN_SAFE_INTEGER
2的负53次方是JS当中最小的数,因此,就会有一个最小的安全整数这么个概念
Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER // true
Number.MIN_SAFE_INTEGER === -9007199254740991 // true
Number.isSafeInteger()
用于判断当前的这个参数是不是一个安全的整数 JavaScript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,无法精确表示这个值。
Math.pow(2, 53) // 9007199254740992
Math.pow(2, 53) === Math.pow(2, 53) + 1 // true
Math扩展
Math.trunc()
方法用于去除一个数的小数部分,返回整数部分。它会先把参数转为Number型 它和Number.parseInt()的区别在于 对Boolean类型的处理上,Math.trunc()会把true转换为1,false转换为0,但是Number.parseInt()会把true返回为NaN。
console.log(Math.trunc(5.5)) // 5
console.log(Math.trunc(-5.5)) // -5
console.log(Math.trunc(true)) // 1
console.log(Math.trunc(false)) // 0
console.log(Math.trunc(NaN)) // NaN
console.log(Math.trunc(undefined)) // NaN
console.log(Math.trunc('str')) // NaN
console.log(Math.trunc(null)) // 0
console.log(Math.trunc()) // NaN
console.log(Number.parseInt(5.5)) // 5
console.log(Number.parseInt(-5.5)) // -5
console.log(Number.parseInt(true)) // NaN
console.log(Number.parseInt(false)) // NaN
Math.sign()
方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。正数返回+1,负数返回-1,0返回0,-0返回-0,其他值返回NaN
console.log(Math.sign(5)) // 1
console.log(Math.sign(-5)) // -1
console.log(Math.sign(0)) // 0
console.log(Math.sign(NaN)) // NaN
console.log(Math.sign(true)) // 1
console.log(Math.sign(false)) // 0
Math.cbrt()
计算一个数的立方根
console.log(Math.cbrt(8)) // 2
console.log(Math.cbrt('xs')) // NaN