ES6学习系列——Number 扩展

1、二进制和八进制表示

ES5 中,严格模式不允许使用前缀0o;
而在 ES6 中,就可以使用前缀0o(或者0O)0b(或者0B),分别表示八进制和二进制数值;
如果想要将数值转换成十进制,就要用 Number():

Number('0b111'); // 7
Number('0o10'); // 8
2、Number.isFinite()、Number.isNaN()

在 ES5 中的 isFinite()isNaN(),处理非数值参数会先调用Number() 方法来转换,
而这两个新方法不会,会直接进行判断:
Number.isFinite() 对于非数值直接返回false;
Number.isNaN() 对于非 NaN 直接返回false;

3、Number.parseInt()、Number.parseFloat()

这两个方法跟ES5 中的行为保持一致,只不过是全局方法变成了 Number 对象上的方法而已;

4、Number.isInteger()

这个方法用来判断传入的参数是否是一个整数,会直接判断,不会对非数值再去调用 Number() 方法来转换;
值得注意的是,在JS中,整数和浮点数的存储方式是一样的,所以 3 和 3.0 会被视为严格相等;

Number.isInteger(25) // true
Number.isInteger(25.0) // true
5、Number.EPSILON

这是一个极小的常量,表示 1 与大于 1 的最小浮点数之间的差。常常用于检查浮点数运算的误差是否可以接受;

6、Number.isSafeInteger()

这个方法会返回一个布尔值,用来判断一个整数是否在安全范围内;
那么就要谈到一个概念:安全整数;
jS 可以精确表示的整数范围在 (-2^53, 2^53) 区间内,区间外的整数就无法精确表示,
所以 ES6 就引入两个常量 Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER,来表示这个范围的上下限;

Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 // true
Number.MIN_SAFE_INTEGER === - Math.pow(2, 53) + 1 // true
Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER // true
7、Math对象的扩展
(1)Math.trunc()

这个方法用于截去数值的小数部分,返回整数部分;
这个方法内部会先调用 Number() 方法来将传入的参数先转为数值,来处理那些非数值;

Math.trunc('123.44'); // 123

//对于空值,Number()无法处理的值,都会返回NaN
Math.trunc(NaN); // NaN
Math.trunc('adc'); // NaN
Math.trunc(); // NaN
(2)Math.sign()

这个方法用于判断一个数值是负数、正数或者零,传入参数,返回+1(对应正数)、-1(对应负数)、0(对应0)、-0(对应-0)、NaN(对应其他值):

Math.trunc(123); // +1
Math.trunc('123'); // +1
Math.trunc(-123); // -1
Math.trunc(0); // 0
Math.trunc(-0); // -0
Math.trunc('adc'); // NaN
(3)Math.cbrt()

这个方法用于计算一个数的立方根。对于传入的非数字参数,这个方法会先调用Number() 方法来转换,无法处理就返回NaN;

(4)Math.clz32(n)

JS 的整数使用 32 位二进制形式表示,而 Math.clz32()方法返回数 n 的 32 位无符号整数形式有多少个前导 0。

Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1000) // 22
Math.clz32(0b01000000000000000000000000000000) // 1
Math.clz32(0b00100000000000000000000000000000) // 2

//对于小数,只考虑整数部分
Math.clz32(3.2) // 30

//对于空值或其他类型的值,Math.clz32方法会将它们先转为数值,然后再计算。
Math.clz32() // 32
Math.clz32(NaN) // 32
Math.clz32(Infinity) // 32
Math.clz32(null) // 32
Math.clz32('foo') // 32
Math.clz32([]) // 32
Math.clz32({}) // 32
Math.clz32(true) // 31
(5)Math.imul(x, y)

这个方法 x 和 y 两个数以32 位带符号的整数形式相乘的结果,返回的也是一个 32 位带符号的整数;

(6)Math.fround(n)

返回一个数 n 的 32 位单精度浮点数,如果 n 是整数,那么返回的也是这个整数 n,这个方法针对的是那些无法用64 个二进制位精确表示的小数。

(7)Math.hypot()

返回所有传入的参数的平方的总和的平方根,参数如果有Number() 也无法处理成数值的话,返回 NaN;

(8)对数方法
  • Math.expm1(x): 相当于Math.exp(x)-1

  • Math.log1p(x): 相当于Math.log(1+x),返回的是ln(x+1),若 x = -1, 返回-Infinity,小于-1则返回 NaN;

  • Math.log2()Math.log10(): 分别返回以2 和 10 为底数的 x 的对数,参考上面可知 x 小于 0 会返回 NaN;

(9)双曲函数方法

Math.sinh(x) 返回x的双曲正弦(hyperbolic sine)
Math.cosh(x) 返回x的双曲余弦(hyperbolic cosine)
Math.tanh(x) 返回x的双曲正切(hyperbolic tangent)
Math.asinh(x) 返回x的反双曲正弦(inverse hyperbolic sine)
Math.acosh(x) 返回x的反双曲余弦(inverse hyperbolic cosine)
Math.atanh(x) 返回x的反双曲正切(inverse hyperbolic tangent)

(10)Math.signbit()

判断一个数值是否是负值,负值(包括-0)返回true,正值和NaN返回false;

Math.signbit( ); // true
Math.signbit(); // true
Math.signbit(NaN); // false
Math.signbit(3); // fasle
8、指数运算符

ES5 也有指数运算的方法:Math.paw();
ES6 引入一个新的指数运算符**,跟等号结合也可以形成一个赋值运算符**=:

let a = 2 ** 2; // 4
a **= 2; // 16  相当于 a = a * a;
let b = 2;
b **= 3; // 8  相当于 b = b * b * b;
9、Integer 数据类型

为了解决Js中所有数字都是以64位浮点数来保存而导致整数精确度只能到53个二进制位范围内的问题。就有个提案提出了Integer 数据类型;
形式:所有进制的Integer 类型数据都会加上 n

1n + 2n //3n
0b1101n //二进制
0o777n //八进制
0xFFn //十六进制

生成方法
ES6 原生提供 Integer 对象来生成 Integer 类型数据,用法和Number() 很类似;

Integer(2333); //2333n
Integer('2333'); //2333n
Integer(true); //1n
Integer(false); //0n

//注意不要这样用:
new Integer(); //TypeError
Integer(null); //TypeError
Integer(undefined); //TypeError
Integer('2333a'); //SyntaxError
Integer('adc'); //SyntaxError
Integer 类型数据的运算:

Integer 和 Number 类型在加减乘+ 、- 、*运算以及指数运算**是一样的,但是除法有点区别:如果结果是小数,会舍去小数部分;

9n/5n //1n

另外,Number的运算符中,除了不带符号的右移位运算符>>> 和一元求正运算符 +, 其他的都可以使用;

>>>要求最高位补0,而Integer 类型没有最高位,就导致这个运算符无意义,而后者是因为求正运算符+ 总是会返回Number 类型;

再有一点就是,一般而言,千万不要混用 Number数据 和 Integer数据 ,除了严格相等号===;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值