当前位置: 首页 > Web前端 > vue.js

数值扩展方法和新数据类型BigInt

时间:2023-03-31 19:12:45 vue.js

二进制和八进制表示法ES6提供了一种新的二进制和八进制值的写法,分别使用前缀0b(或0B)和0o或(0O)来表示0b111110111===503//真;0o767===503;//true从es5开始,严格模式下八进制不允许使用前缀0,否则会报错//strictmode(function(){console.log(0o11===011);//报错})()//非严格模式(function(){console.log(0o11===011);//true})()如果要将以0b和0o为前缀的字符串值转换为十进制,就用NumberNumber('0o111')//7Number('0o10')//8个数字分隔符较长的数值允许添加分隔符,es2021允许js值使用下划线(_)作为分隔符让num=1_000_000_000console.log(1000000000===num);//true注意:分隔符不影响原始值delimiter对间隔数没有限制letnum2=1_00_0000_00console.log(100000000===num2);//真正的十进制和科学计数法也可以使用数字分隔符console.log(0.00_01);//0.0001console.log(1e10_000);//无穷大需要注意1,_不能放在值的前面或末尾2,_两个或多个定界符不能一起使用3._小数点前后不能有定界符4._在科学计数法中,E或代表指数的e前后不能有分隔符。_Separators也可以用于其他bases中的valuesconsole.log(0b1010_0001_1000_0101);//二进制console.log(0xA0_B0_C0);//十六进制注意:基本系统前缀前后不能使用分隔符:0b、0B、0o、0O、0x、0X不支持数字分隔符的功能:1、Number()2,parseInt()3,parseFloat()Number('123_456');//NaNparseInt('123_456');//123Number.isFinite(),Number.isNaN()Number.isFinite():usedCheckifanumberisfinite,i.e.notInfinityfinite:truenon-finiteornon-numeric:falseNumber.isFinite(10);//trueNumber.isFinite(1.2);//trueNumber.isFinite(NaN);//falseNumber.isFinite(Infinity);//falseNumber.isFinite('东方无敌');//falseNumber.isFinite('123');//falseNumber.isFinite(true);//falseNumber.isNaN():用于检查一个值是否为NaN,如果参数不是NaN,则返回falseNumber.isNaN(NaN);//trueNumber.isNaN(10);//falseNumber.isNaN('10');//falseNumber.isNaN(true);//假数字。是NaN(9/NaN);//trueNumber.isNaN('东方不败'*10);//trueNumber.isNaN(true/true);//true注意和传统的全局方法isFinite()和isNaN()不同的是,传统的方法是先调用Number()将非数值转换成数值,然后判断,但是这两个新方法只对数值有效Number.isFinite()对非数值返回false。Number.isNaN()只对NaN返回true,对非NaN返回false。Number.parseInt(),Number.parseFloat()ES5:parseInt(),parseFloat()ES6:数字。parseInt()和Number.parseFloat()的行为是完全一致的。这样做的目的是逐步减少全局方法,使语言逐渐模块化。parseInt('12.55');//12Number.parseInt('12.55');//12parseFloat('12.55');//12.55Number.parseFloat('12.55');//12.55isInteger()Number.isInteger()用于判断值是否为整数Number.isInteger(15);//trueNumber.isInteger(15.1);//false返回falseNumber.isInteger('15');//falseNumber.isInteger(true);//假数字.isInteger(NaN);//假数字.isInteger();//falseJavaScript采用IEEE754标准,值以64位双精度格式存储。数值精度最高可达53位二进制数(1位隐藏位,52位有效位)。如果数值精度超过这个限制,第54位和后续位将被丢弃。在这种情况下,Number.isInteger可能会误判。Number.isInteger(3.0000000000000002)//true在上面的代码中,Number.isInteger的参数显然不是一个整数,但是它会返回true。原因是这个小数的精度达到了小数点后16位,转成二进制超过了53个二进制位,导致最后2位被舍弃。==!!!!!!总之,如果对数据精度要求高,不推荐使用Number.isInteger()来判断一个值是否为整数。==MathobjectextensionMath.trunc()Math.trunc用于去掉数值的小数部分,返回整数部分Math.trunc(5.1);//5Math.trunc(5.5);//5Math.trunc(-5.1);//-5Math.trunc(-0.123);//0对于非数值,它会先使用Number方法将其转换为数值,然后返回Math.trunc(true);//1Math.trunc(false);//0Math.trunc(null);//0Math.trunc('10.123');//10为空值或无法转换的值返回NaNMath.trunc(NaN);//NaNMath.trunc('你好');//NaNMath.trunc();//NaNMath.sign()Math.sign()方法用于确定数字是正数、负数还是零。非数值会先转为数值,表示结果参数为正数+1参数为负数-1参数不为00参数为-0-0otherNaNMath.sign('5');//1Math.sign(5);//1Math.sign(-5);//-1Math.sign(0);//0数学符号(-0);//-0Math.sign(true);//1Math.sign('你好');//NaNMath.hypot()Math.hypot()方法返回所有参数的平方和和平方根Math.hypot(3,4);//5Math.hypot(3,4,5);//7.0710678118654755Math.hypot(3,4,'5');//7.0710678118654755Math.hypot(3,4,'你好');//NaNMath.hypot();//0强调!BigInt数据类型js的所有数字都存储为64位浮点数,这给值的表示带来了很大的局限性。一:值的经度只能达到53个二进制位,相当于16个十进制位,大于这个范围的正数无法准确表示,使得js不适合科学和金融领域的精确计算。二:大于等于2的1024次方的值无法用js表示,会返回Infinity。//超过53个二进制值的值无法保持精度Math.pow(2,53)===Math.pow(2,53)+1;//true//不能表示超过2的1024次方的值Math.pow(2,1024);//对于Infinity,ES2020引入了新的数据类型BigInt(大整数),作为第八种数据类型,BigInt只用来表示整数,没有位数限制,任意位数的整数都可以表示准确地说,语法:datan//useBigIntleta=2172141653nletb=15346349309nconsole.log(a*b);//33334444555566667777n//可以保持精度//公共值letc=2172141653letd=15346349309console.log(c*d);//33334444555566670000//不能保持精度和整数的区别123普通整数123nBigIntBigInt类型的数据必须加后缀nBigInt和普通整数是两种值,它们不等于15n===15;//false数据类型返回biginttypeof(15n);//bigintBigInt函数BigInt可以用来进行数据转换,转换方法与Number()BigInt(123)基本相同;//123nBigInt('123');//123nBigInt(真);//1nBigInt(假);//0n以下是一些报错的场景BigInt();//TypeErrorBigInt('你好');//SyntaxError/*String123n无法解析成Number类型,所以会报错*/BigInt('123n');//SyntaxErrorBigInt(null);//TypeErrorBigInt(NaN);//TypeError/*参数为小数,会报错*/BigInt(1.2);//RangeErrorBigInt('1.2');//SyntaxErrorBigInt继承了Object对象的两个实例方法BigInt.prototype.toString()BigInt.prototype.valueOf()同样继承了Number对象的一个??实例方法BigInt.prototype.toLocaleString(),同时也提供了三个静态方法BigInt.asUintN(width,BigInt)BigInt.asIntN(width,BigInt)BigInt.parseInt(string[,radix])BigInt转换规则可以使用Boolean、Number、String三种方法将BigInt转换为Boolean、numeric、string类型。转换后,后缀n将消失Boolean(0n);//假数字(2n);//2String(2n);//'2'被否定!运算符可以转换布尔值console.log(!0n);//trueconsole.log(!1n);//falseBigInt数学运算在数学运算方面,+-*和**四个运算符与数字类型基本一致,除法运算/会舍去小数部分并返回整数console.log(9/5);//1.8console.log(9n/5n);//1n四舍五入几乎所有的数值运算符都可以在BigInt中使用,但有两个例外无符号右移运算符>>>一元正运算+BigInt运算符不能与普通值混合使用,因为会丢失精度。控制台日志(2n+5);//同理,如果一个函数参数希望是Number类型,但是得到的是一个BigInt,也会报错。//错误的写法Math.sqrt(4n)//报错//正确的写法Math.sqrt(Number(4n))//布尔值对应2BigInt其他操作BigInt,与Number类型一致0n:false1n:trueletn=1nif(n){console.log(true);}else{console.log(false);}//true比较运算符和相等运算符允许BigInt与其他类型的值混合,因为没有这样做会损失精度。控制台日志(0n<1);//真console.log(0n==false);//真console.log(0n==0);//真console.log(0n===0);//false案例源码:https://gitee.com/wang_fan_w/es6-science-institute如果您觉得本文对您有帮助,请点亮star