JavaScript ES(6-11)全版本语法 (十二):数值的扩展

154 阅读3分钟

前提概要

上一篇编写的是ES6中的RegExp的y修饰符和u修饰符,链接:juejin.cn/post/702138… , 这次写的是ES6中数值的扩展,这次介绍ES6中数值的部分基础知识,其他的知识点以后再慢慢补充。如有不对的或者不准确的地方,欢迎大家提出😄,我也积极修改。最近因为自己的私事耽误了半个月,没有发文章。下边开始正文:

src=http___img.wxcha.com_file_202001_07_9e775aad13.jpg&refer=http___img.wxcha.jpg

二进制(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