BigInt公司

基线 广泛可用

此功能已得到很好的建立,可在许多设备和浏览器版本中使用。从那时起,它就可以跨浏览器使用了 2020年9月.

BigInt公司值表示以下数值太大了 原始的.

描述

A类BigInt值,有时也称为BigInt公司,是一个bigint公司 原始的,通过附加创建n个或通过调用BigInt()功能(不带新的操作符)并给它一个整数值或字符串值。

js公司
const previouslyMaxSafeInteger=9007199254740991n;const alsoHuge=BigInt(9007199254740991);//9007199254740991年const hugeString=BigInt(“9007199254740991”);//9007199254740991年const hugeHex=BigInt(“0x1ffffffffff”);//9007199254740991年const hugeOctal=BigInt(“0o377777777777”);//9007199254740991年const hugeBin=BigInt(“0b111111111111111、1111111111、111111111和11111111111”,);//9007199254740991年

BigInt值在某些方面与Number值类似,但在一些关键问题上也有所不同:BigInt值不能与内置数学对象,并且在操作中不能与Number值混合;必须将它们强制为同一类型。但是,要小心来回强制值,因为当BigInt值被强制为Number值时,它的精度可能会丢失。

类型信息

当针对类型,BigInt值(bigint公司原语)将给出“bigint”:

js公司
类型1n===“bigint”;//真的BigInt的类型(“1”)===“BigInt”;//真的

BigInt值也可以包装在对象:

js公司
对象类型(1n)===“对象”;//真的

操作员

大多数运算符支持BigInt,但大多数运算符不允许操作数为混合类型-两个操作数都必须是BigInt:

布尔重转运算符允许将数字和BigInt混合作为操作数:

有几个运算符根本不支持BigInt:

特殊情况:

  • 添加(+)包含字符串,BigInt返回字符串。
  • 部门(/)将分数分量截断为零,因为BigInt无法表示分数量。
js公司
const previousMaxSafe=BigInt(数字.MAX_SAFE_INTEGER);//9007199254740991年const maxPlusOne=上一个MaxSafe+1n;//9007199254740992年const the Future=前一个MaxSafe+2n;//9007199254740993n,现在可以工作了!const multi=previousMaxSafe*2n;//18014398509481982年const subtr=多个-10n;//18014398509481972年const mod=多个%10n;//2个常量bigN=2n**54n;//18014398509481984牛顿bigN*-1n;//-18014398509481984牛顿预期常数=4n/2n;//2个常量截断=5n/2n;//2n,而不是2.5n

比较

BigInt值并不严格等于Number值,但它大致如此:

js公司
0n===0;//0n==0;//真的

Number值和BigInt值可以像往常一样进行比较:

js公司
1n<2;//真的2n>1;//真的2 > 2; // 2n>2;//2n>=2;//真的

BigInt值和Number值可以在数组中混合并排序:

js公司
混合常数=[4n,6,-12n,10,4,0,0n];//[4n,6,-12n,10,4,0,0n]mixed.sort();//默认排序行为//[-12n,0,0n,10,4n,4,6]混合排序(a,b)=>a-b);//因为减法不适用于混合类型,所以不起作用//TypeError:无法将BigInt值转换为Number值//使用适当的数字比较器进行排序混合排序((a,b)=>(a<b?-1:a>b?1:0));//[-12n,0,0n,4n,4,6,10]

请注意,与对象-包装的BigInt值与其他对象一样,仅在比较同一对象实例时表示相等:

js公司
对象(0n)===0n;//对象(0n)===对象(0n);//const o=对象(0n);o==o;//真的

由于Number值和BigInt值之间的强制可能会导致精度损失,因此建议执行以下操作:

  • 仅当值大于2时才使用BigInt值53是合理预期的。
  • 不要强制使用BigInt值和Number值。

条件

在以下情况下,BigInt值遵循与Numbers相同的转换规则:

也就是说,只有0个虚伪的; 其他的都是真实的.

js公司
如果(0n){console.log(“来自if的您好!”);}其他{console.log(“Hello from the else!”);}//“其他人你好!”0n||12n;//12个0n&&12n;//0个布尔值(0n);//布尔值(12n);//真的!12n;//!0n;//真的

密码学

BigInt值支持的操作不是固定时间的,因此对定时攻击因此,在没有缓解因素的情况下,在加密中使用.JavaScript BigInts可能是危险的。作为一个非常常见的示例,攻击者可以测量101n**65537n17个**9999个,并根据经过的时间推断秘密(如私钥)的大小。如果您仍然需要使用BigInts,请查看定时攻击常见问题获取有关该问题的一般建议。

在JSON中使用

使用JSON.stringify()任何BigInt值都将引发类型错误,因为BigInt值默认不会在JSON中序列化。然而,JSON.stringify()特别为BigInt值留下了后门:它会尝试调用BigInt's到JSON()方法。(对于任何其他原语值都不这样做。)因此,您可以实现自己的到JSON()方法(这是不明确建议修补内置对象的少数几种情况之一):

js公司
BigInt.prototype.toJSON=函数(){return{$bigint:this.toString()};};

不是扔,JSON.stringify()现在生成如下字符串:

js公司
console.log(JSON.stringify({a:1n}));//{“a”:{“$bigint”:“1”}}

如果您不想修补BigInt.prototype(BigInt.prototype),您可以使用更换者的参数JSON.stringify格式序列化BigInt值:

js公司
const replacer=(键,值)=>typeof value===“bigint”?{$bigint:value.toString()}:value;常量数据={数量:1,大:18014398509481982n,};const stringified=JSON.stringify(数据,替换程序);console.log(字符串化);//{“数字”:1,“大”:{“$bigint”:“18014398509481982”}}

然后可以使用复兴者的参数JSON.parse格式处理它们:

js公司
常数恢复器=(键,值)=>值!==空&&typeof value===“对象”&&值为“$bigint”&&值的类型$bigint===“字符串”? BigInt(值.$BigInt):值;const payload='{“number”:1,“big”:{“$bigint”:“18014398509481982”}}';const-parsed=JSON.parse(有效负载,恢复器);console.log(已解析);//{编号:1,大:18014398509481982n}

注:虽然可以制造JSON.stringify()如上所示,通用并正确序列化所有对象的BigInt值JSON.parse()必须谨慎使用,因为序列化是不可逆的:无法区分恰好具有名为的属性的对象$bigint美元和一个实际的BigInt。

此外,上面的示例在替换和恢复期间创建了一个完整的对象,这可能会对包含许多BigInt的较大对象产生性能或存储影响。如果您知道有效负载的形状,那么最好只是将它们序列化为字符串,然后根据属性键的名称重新激活它们。

事实上,JSON允许任意长的数字文字;在JavaScript中无法完全精确地解析它们。如果您正在使用支持较长整数(如64位整数)的语言与另一个程序通信,并且您希望将BigInt作为JSON数字而不是JSON字符串传输,请参阅无损数字序列化.

BigInt强制

许多期望BigInts的内置操作首先将其参数强制为BigInt。操作可以概括如下:

在JavaScript中实现几乎相同效果的最佳方法是通过BigInt()功能:大Int(x)使用相同的算法进行转换x个,除了那个数字不要扔类型错误,但如果是整数,则转换为BigInt。

请注意,需要BigInt的内置操作通常会在强制后将BigInts截断为固定宽度。这包括BigInt.asIntN(),BigInt.asUintN()、和方法BigInt64阵列BigUint64阵列.

施工单位

BigInt()

返回BigInt类型的基元值。使用调用时引发错误新的.

静态方法

BigInt.asIntN()

将BigInt值钳制为带符号的整数值,并返回该值。

BigInt.asUintN()

将BigInt值箝位为无符号整数值,然后返回该值。

实例属性

这些属性定义于BigInt.原型并由所有人共享BigInt公司实例。

BigInt.原型.constructor

创建实例对象的构造函数。对于BigInt公司实例,初始值为BigInt公司构造函数。

BigInt.原型[Symbol.toStringTag]

的初始值[Symbol.toStringTag]属性是字符串“BigInt”。此属性用于Object.prototype.toString()然而,因为BigInt公司也有自己的toString()方法,除非调用Object.protype.toString.call()使用BigInt作为这个Arg.

实例方法

BigInt.原型.toLocaleString()

返回具有此BigInt值的语言敏感表示形式的字符串。覆盖Object.prototype.toLocaleString()方法。

BigInt.prototype.toString()

返回以指定基数(基数)表示此BigInt值的字符串。覆盖Object.prototype.toString()方法。

BigInt.prototype.valueOf()

返回此BigInt值。覆盖Object.prototype.valueOf()方法。

示例

计算素数

js公司
//如果传递的BigInt值是质数,则返回true函数isPrime(p){for(设i=2n;i*i<=p;i++){如果(p%i===0n)返回false;}返回true;}//以BigInt值作为参数,返回第n个质数作为BigInts值函数nthPrime(nth){设maybePrime=2n;设素数=0n;while(nth>=0n){if(isPrime(可能是Prime)){第n个--;prime=可能是prime;}可以是Prime++;}返回素数;}第n素数(20n);//730亿

规格

规范
ECMAScript语言规范
#次原始对象

浏览器兼容性

BCD表仅在浏览器中加载

另请参见