ES6 - 数值的拓展

209 阅读3分钟

二进制与八进制

在JS中如何把十进制转化为二进制?

const a = 5
console.log(a.toString(2));  // 101

如何把二进制转化为十进制?

const b = 101
console.log(parseInt(b,2));  // 5

ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。

ES5中严格模式下,进制的数不允许前缀用0表示

const a = 0101    // Legacy octal literals are not allowed in strict mode

const a = 0B0101
console.log(a);  // 5

const b = 0o777
console.log(b);  // 511

新增方法

Number.isFinite()

用来检查一个数值是否为有限的(finite),即不是Infinity.如果当前判断的数据类型是数,那么就判断这个数是不是有限的,如果当前的数据类型不是数就返回false

console.log(Number.isFinite(5));
console.log(Number.isFinite(0.5));
console.log(Number.isFinite(Infinity));  // 判断无限的是不是有限的
console.log(Number.isFinite('lee'));  
console.log(Number.isFinite(true));  

Number.isNaN()

用来检查一个值是否为NaN。

ES5中很多方法都是挂在window上,eg:window.isNaN(),这样存在的问题就是让全局对象window变得越来越大,不利于模块化管理。ES6中会将全局的方法,逐步的移动到相应的对象上,eg:Number、String、Math等

console.log(Number.isNaN(NaN));    // true
console.log(Number.isNaN(5));      // false

Number.parseInt() && Number.parseFloat()

console.log(Number.parseInt(5.5));    // 5
console.log(Number.parseFloat(5.5))   // 5.5
console.log(parseInt(5.5));    // 5    相当于调用window.parseInt(5.5)
console.log(parseFloat(5.5))   // 5.5  相当于调用window.parseInt(5.5)

Number.isInteger()

用来判断一个数值是否为整数。

console.log(Number.isInteger(5));      // true
console.log(Number.isInteger(5.2));    // false

0.1 + 0.2 === 0.3 ???

数学中是没错的,但是在计算机中数字是如何存储和运算的?

在计算机中,不管是整数还是浮点数,都是以二进制进行存储的,计算机只认识0和1

0.1 + 0.2   // 0.30000000000000004

在ES中会采用IEEE754双精度标准去存储,存储一个数字需要的二进制数字位数比较多,这样做的目的是为了更加精确

把35用一个8位的二进制数表示 00100011

把0.375用二进制表示 0.011

把0.1转成二进制数, 由于无法整除,转成二进制数 ===> 0.000110011...

由于存储空间是有限的因此要舍弃省略号后面无法整除的数

因此得到的只是一个近似值

eg:

console.log(0.1000000000000001);            // 小数点后面14个0     结果:0.1000000000000001
console.log(0.10000000000000001);           // 小数点后面15个0    结果:0.1
console.log(0.10000000000000001 === 0.1);  // true

由于后面的数超出了它存储的范围,那么后面的就会被舍掉

因此0.1 + 0.2 不等于0.3,因为当前的0.1被转成二进制数存在电脑中存在精度缺失,真正存的只是0.1的近似值,所以最后进行加法的时候得到的结果是一堆0和一个4

Number.MAX_SAFE_INTEGER

返回一个最大值的常量

ES中整数的最大值是2^53次方,因此从下图中可以知道:如果那不是最大值,显示的就是最大值+1后的结果,但是结果是不变的

const max = Math.pow(2,53)             
console.log(max);                                  // 9007199254740992
console.log(max + 1);                              // 9007199254740992
console.log(Number.MAX_SAFE_INTEGER === max -1);   // true

Number.MIN_SAFE_INTEGER

返回一个最小值的常量

ES中整数的最小值是-2^53次方

Number.isSafeInteger()

判断一个数是否在安全的区间内,JavaScript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,无法精确表示这个值。

console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER));       // true
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1));  // false
console.log(Math.pow(2, 53) === Math.pow(2, 53) + 1);           // true

Math扩展

Math.trunc()

用于去除一个数的小数部分,返回整数部分。那么它和parseInt()有什么区别呢?Math.trunc(xxx)它会将xxx先转成number类型,如果遇到不能转成number也返回NaN

console.log(Math.trunc(true));           // 1
console.log(Number.parseInt(true));      // NaN
console.log(Math.trunc(false));          // 0
console.log(Number.parseInt(false));     // NaN
console.log(Math.trunc(NaN));            // NaN

Math.sign()

方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。

它会返回五种值。

  • 参数为正数,返回+1
  • 参数为负数,返回-1
  • 参数为 0,返回0
  • 参数为-0,返回-0
  • 其他值,返回NaN
console.log(Math.sign(6));                // 1
console.log(Math.sign(-6));               // -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('leee'));            // NaN