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_INTEGER
和 Number.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数据 ,除了严格相等号===
;