我转过几个弯 绕过那个小雨楼
拿着蒲扇摆着衣衫渡着紧箍咒
不问天涯不停留 喝过几壶酒
不过年少白头道义放胸口
倘若明天之后 遥看前尘剑封侯
似那天上神仙无所求
朝朝暮暮君如梦醒十分不为何理由
是真是假是惶恐是无休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
又过了几个弯 算尽天量道莫慌
踏这田园闻这芳草香
跌跌撞撞仗剑天涯折煞不枉无笔良
是梦是幻是温柔是家乡
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
谁能与我一醉方休
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
目前测试这个整数暂时浏览器还没支持,有空再进行详细的测试。
评论(0)