Number 类型
二进制和八进制表示法
es6提供了新的表示方法:
数字:503
二进制
111110111 //es5
0b111110111 //es6
八进制
767 //es5
0o767 //es6
也就是加了个前缀,二进制前缀是:0b
,八进制前缀是:0o
,后面的字母大写也是可以的,都一样。
isFinite()和isNaN()
is开头一般都是用于判断的,这两个方法为Number对象新增的两个方法, isFinite用于判断数字是否为有限的数字,isNaN就判断值是否为NaN
需要注意的是,这两个方法和以前的方法不同,他们不会先转换值为number类型再进行比对,而是直接判断,不为数字就返回false。
Number.isFinite() 有限数字
Number.isFinite(15.6) true
Number.isFinite(15) true
Number.isFinite('15') false
Number.isFinite(NaN) false
Number.isFinite(Infinity) false
Number.isFinite(-Infinity) false
Number.isNaN() 无限数字
Number.isNaN(15.6) false
Number.isNaN(NaN) true
Number.isNaN('15') false
Number.isNaN(9/NaN) true
Number.isNaN('true'/0) true
Number.isNaN('true'/'true') true
isNaN判断的是最终那个值,所以错误的算法得到的NaN会被正确判断到。
parseInt()和parseFloat()
parseInt作为一个es5中全局的方法,用于去除浮点数。
parseFloat作为一个es5中全局的方法,用于将字符串转换为数字。
parseInt(15.6) 15
parseFloat('15.6@') 15.6
es6为了使语言模块化,在逐步的减少全局性方法,所以这两个方法可以直接通过Number对象调用,当然他们的使用是等价的,所以推荐通过Number对象使用该方法。
Number.parseInt(15.6) 15
Number.parseFloat('15.6@') 15.6
isInteger()
用于判断一个数字是否为整数,他也是不会自动将值进行隐式转换为number类型的。
需要注意的是,由于整数和浮点数在js里面的,存储的方式是一样的,所以3和3.0是相等的,会被识别为整数,而3.1则不行
Number.isInteger(15) true
Number.isInteger(15.0) true
Number.isInteger(15.6) false
Number.isInteger('15.6') false
Number.isInteger(true) false
EPSILON() 预设误差
js的浮点运算,他基本上算的不是精确的,所以他会有误差,然后Number.EPSILON()
他相当于官方给定的一个误差范围,小于这个误差范围就被认为计算得到了正确结果。
Number.EPSILON()
//2.220446049250313e-16
所以我们可以想到这样一个公式。
2.1+2.9=5;
2.1+2.9-5=0;
这是我们的基本认识,但是在js里面,浮点数计算得到值就不是这样了,所以需要做个判断
let num = 2.1+2.9-5;
if(num > Number.EPSILON() ) {
console.log("结果不准确");
}else {
console.log("结果准确");
}
那么我们可以将它封装成一个方法
function withinErrorMargin(left,right){
return Math.abs(left - right) < Number.EPSILON();
}
withinErrorMargin(2.1+2.9,5); //true
安全整数和isSafeInteger()
js的数值能被精确显示的,是有范围的,在-2的53次方和2的53次方之间,不包含两个端点。
在超出这个范围后,数值就不精确了。
es6引入了两个常量来表示这两个上限:
Number.MAX_SAFE_INTEGER
=== Math.pow(2,53) -1Number.MIN_SAFE_INTEGER
=== -(Math.pow(2,53) - 1)isSafeInteger()方法则是判断这个值是否在这个安全范围内。
但是使用的时候我们需要注意,要对所有需要计算的值进行判断,不然一个超出范围的值,去计算另一个值,得到的值也是不精确的,那么你对这结果进行isSafeInteger判断,实际上没有什么意义了。
所以isSafeInteger在判断数值是否在安全整数范围内,除了判断计算结果,还要验证参与运算的每个值。
Math对象扩展
trunc() 去除浮点数
es5对去除浮点数有点麻烦,因为正数和负数去除浮点数是不一样的方法,所以es6做了统一方法。
不管数字是正数还是负数,都能去除浮点数,但是如果值为空,或者NaN,string字符串这种无法被转换为number然后截取的,统一返回NaN
也就说说该方法也会先将参数转为数字类型,再进行截取。
Math.trunc(15.6) 15
Math.trunc(-15.6) -15
Math.trunc(15.9) 15
Math.trunc('15.6') 15
Math.trunc('foot') NaN
Math.trunc() NaN
Math.trunc(NaN) NaN
当然我们也可以使用es5自己封装一个方法
Math.trunc = Math.trunc || function(x){
return x < 0 ? Math.ceil(x) : Math.floor(x);
}
sign()
sign是一个判断参数是正数,负数,0,的一个方法,对于无法判断的,统一返回NaN。
sign会先将参数转为数值在进行判断,如果是正数,就返回+1
,负数返回-1
,0的话也有正负,返回+0
或者-0
Math.sign(5) +1
Math.sign(-5) -1
Math.sign(0) +0
Math.sign(-0) -0
Math.sign('9') +1
Math.sign('foo') NaN
Math.sign() NaN
cbrt()
用于计算一个数的立方根,他也会先将参数转为数字,再计算,无法计算的统一返回NaN。
Math.cbrt(-1) -1
Math.cbrt(0) 0
Math.cbrt(1) 1
Math.cbrt(2) 1.2599210498948734
Math.cbrt('2') 2
Math.cbrt('foo') NaN
Math.cbrt() NaN
clz32()
返回一个数32位无符号整数形式有多少个前导0
Math.clz32(0) 32
Math.clz32(1) 31
Math.clz32(1000) 22
Math.clz32(0b01000000000000000000000000000000) 1
Math.clz32(0b00100000000000000000000000000000) 2
Math.clz32('foo') 32
Math.clz32() 32
Math.clz32(NaN) 32
Math.clz32([]) 32
Math.clz32({}) 32
Math.clz32(true) 32
他就是将参数转为32位,然后计算前导零位数。
imul()
返回两个数以32位带符号整数形式相乘的结果,返回的也是一个32位的带符号整数
Math.imul(2,4) 8
Math.imul(-1,8) -8
Math.imul(-2,-2) 4
Math.imul(0x7fffffff,0x7fffffff) 1
简单点理解为,他是一个安全整数的乘法,在安全整数返回内,返回的值就是正常乘法得到的值,但是当数值超出了安全范围,统一返回1这个在二进制里面最低位数字。
fround()
这个方法返回一个数的单精度浮点数形式。
Math.fround(0) 0
Math.fround(1) 1
Math.fround(1.337) 1.3370000123977661
Math.fround(1.5) 1.5
Math.fround(NaN) NaN
对于整数参数,fround返回的结果是相同的,而带有浮点数的,他会返回最接近这个小数的单精度浮点数。
hypot()
返回所有参数的平方和的平方根
Math.hypot(3,4) 5
Math.hypot(3,4,5) 7.0710678118654755
Math.hypot(0) 0
Math.hypot(NaN) NaN
Math.hypot(3,4,'foo') NaN
Math.hypot(3,4,'5') 7.0710678118654755
Math.hypot(-3) 3
以第一个例子来讲,他就是 3的平方加4的平方之和,再开根号得到其值。
√(3*3)+(4*4) = √9+16 = √25 = 5
指数运算符
es6新增了一个指数运算符**
,他的意思就是平方,后面接几个平方。
2 ** 2 //4 也就是2的2次方
2 ** 3 //8 2的3次方
**
这个符合也可以和=
等于号结合,和+=
这些一样的意思
let a = 1.5;
a **= 2 // a=2.25; 等同于 a = a*a
注意,该方法和Math.pow()方法实现方式不同,所以对于特别大的运算,两者的结果会有细微差异。
Integer
js中数值精确度是有范围限制的,这使得他不能进行科学和金融方面的精确计算,现有一个提案,引入一个新的数据类型Integer(整数类型),该类型只用来表示整数,没有位数限制,任何位数的整数都可以精确表示。
为了和Number类型进行区分,整数类型的数值末尾需要加上字符n
来表示
1n
2n
0b1101n
0o777n
0xFFn
js也提供转换的方法
Integer(123) 123n
Integer('123') 123n
Integer(false) 0n
Integer(true) 1n
Integer() TypeError
Integer(undefined) TypeError
Integer(null) TypeError
Integer('123n') SyntaxError
Integer('abc') SyntaxError
整数的计算,可以套用Number大部分方法,其运算结果也是相同,但是有一些方法不支持。
>>>
右位移运算不支持+
一元求正不支持
整数Integer类型无法和Number类型一起计算。
1n+1 //报错
因为这两种数据类型,都会丢失信息,整数会丢失所有的浮点数,Number超过返回,精确度就会下降。
==相等符号不能再整数类型中使用
1n == 1 //报错
因为相等他会转换数据的类型,所以也是不允许混合使用的,但是全等是可以使用的
1n === 1 //false
目前测试这个整数暂时浏览器还没支持,有空再进行详细的测试。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据