BigInt终于在ES2020中亮相

2021-03-01 19:58:24

BigInt是一个内置对象,提供了一种表示大于2 53-1的整数的方法,这是JavaScript可以可靠地用Number原语表示的最大数字,并由Number.MAX_SAFE_INTEGER常量表示。 BigInt可用于任意大整数。

通过将n附加到整数文字(10n)的末尾或调用函数BigInt()来创建BigInt。

const previousMaxSafeInteger = 9007199254740991n const AlsoHuge = BigInt(9007199254740991)//↪9007199254740991n const hugeString = BigInt(" 9007199254740991")//↪9007199254740991n const hugeHex = BigInt(" ff) 9007199254740991n const hugeOctal = BigInt(" 0o377777777777777777")//↪9007199254740991n const hugeBin = BigInt(" 0b11111111111111111111111111111111111111111111111111111")//↪9007199254740991n

BigInt在某些方面类似于Number,但在一些关键方面也有所不同–它不能与内置Math对象中的方法一起使用,也不能与操作中Number的实例混合;它们必须被强制为相同类型。但是,要小心地来回强制转换值,因为将BigInt转换为Number时,它的精度可能会丢失。

当包装在Object中时,BigInt将被视为普通的" object"。类型:

以下运算符可以与BigInts(或对象包装的BigInts)一起使用:+,*,-,**,%。

除>>>外,还支持按位运算符。 (零填充右移),因为所有BigInts均已签名。

const previousMaxSafe = BigInt(Number。MAX_SAFE_INTEGER)//↪9007199254740991n const maxPlusOne = previousMaxSafe + 1n //↪9007199254740992n const theFuture = previousMaxSafe + 2n //↪9007199254740993n,现在可以使用! const multi = previousMaxSafe * 2n //↪18014398509481982n const subtr = multi – 10n //↪18014398509481972n const mod = multi%10n //↪2n const bigN = 2n ** 54n //↪180143985094819841984nbigN *-1n //↪–18014398509489481984n

但是,由于这些是BigInts而不是BigDecimals,因此此操作将舍入为0(也就是说,它将不返回任何小数位)。

常量const = 4n / 2n //↪2n常量四舍五入= 5n / 2n // n 2n,不是2.5n

1n < 2 //↪true 2n> 1 //↪true 2> 2 //↪false 2n> 2 //↪假2n> = 2 //↪真

const mixed = [4n,6,-12n,10,4,0,0n] //↪[4n,6,-12n,10,4,0,0n] mixed。 sort()//默认排序行为//↪[-12n,0,0n,10,4n,4,6] mixed。 sort((a,b)=> a-b)//不会工作,因为减法不适用于混合类型// TypeError:不能将BigInt转换为数字//用适当的数字排序比较器混合。 sort((a,b)=>(a< b)?-1:((a&b; b)?1:0))//↪[-12n,0,0n,4n,4,6, 10]

请注意,与对象包装的BigInts进行的比较与对其他对象的比较一样,仅当比较相同的对象实例时才表示相等:

0n ===对象(0n)//错误对象(0n)===对象(0n)//错误const o =对象(0n)o === o // true

如果(0n){控制台。日志(如果是,则为&#39您好!')}其他{控制台。 log(' else的问候!')} //↪" Hello else的问候!" 0n || 12n //↪12n 0n&& 12n //↪0n布尔(0n)//↪false布尔(12n)//↪true! 12n //↪假! 0n //↪是

返回一个字符串,该字符串表示指定基数(基数)中的指定对象。重写Object.prototype.toString()方法。

由于Number和BigInt之间的强制可能会导致精度降低,因此建议仅在合理预期大于2 53的值时才使用BigInt,而不要在两种类型之间强制使用BigInt。

BigInts支持的操作不是固定时间。因此,BigInt不适合用于密码学中。

将JSON.stringify()与任何BigInt值一起使用会引发TypeError,因为默认情况下不会在JSON中序列化BigInt值。但是,如果需要,您可以实现自己的toJSON方法:

//如果传递的BigInt是质数函数,则返回true isPrime(p){for(let i = 2n; i * i< = p; i ++){if(p%i === 0n)return false; } return true} //以Bi​​gInt作为参数,返回第n个素数作为BigInt函数nthPrime(nth){let mayPrime = 2n let prime = 0n while(nth> = 0n){if(isPrime(maybePrime)){ nth-素=可能Prime}可能Prime ++}返回素} nthPrime(20n)//↪73n

下表提供了此功能的每日实施状态,因为该功能尚未达到跨浏览器的稳定性。数据是通过在每个浏览器的JavaScript引擎的夜间版本或最新版本的Test262(JavaScript的标准测试套件)中运行相关功能测试生成的。