JS新增基本数据类型---BigInt

它是个什么东西?

乍一看,一个新的基本数据类型,大个儿的Int?那么这个大个的Int到底是干什么的呢?前端

做用: BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值。chrome

因此说它是个大个儿的Int彻底没得问题,在对z大整数执行数学运算时,以任意精度表示整数的能力尤其重要,使用BigInt,整数溢出将再也不是问题。安全

此外,能够安全地使用更加准确时间戳,大整数ID等,而无需使用变通方法。bash

为何须要BigInt?

在JS中,全部的数字都以双精度64位浮点格式表示,那带来的问题是什么呢!?函数

没错,JS中的Number没法精确表示很是大的整数,它会将很是大的整数四舍五入,确切地说,JS中的Number类型只能安全地表示-9007199254740991(-(2^53-1))和9007199254740991((2^53-1)),任何超出此范围的整数值均可能失去精度spa

console.log(999999999999999);  //=>10000000000000000
复制代码

这就会带来必定的安全问题,好比:.net

// 注意最后一位的数字	

9007199254740992 === 9007199254740993;    // → true
复制代码

建立BigInt

要建立BigInt,只须要在数字末尾追加n便可。 注:chrome 67+开始支持BigInt。code

console.log( 9007199254740995n );    // → 9007199254740995n	
console.log( 9007199254740995 );     // → 9007199254740996
复制代码

这就在必定程度上解决了Number四舍五入的问题cdn

另外一种建立BigInt的方法是用BigInt()构造函数blog

BigInt("9007199254740995");    // → 9007199254740995n
复制代码

BigInt的运算

除一元加号(+)运算符外,全部算术运算符均可用于 BigInt

10n + 20n;    // → 30n	
10n - 20n;    // → -10n	
+10n;         // → TypeError: Cannot convert a BigInt value to a number	
-10n;         // → -10n	
10n * 20n;    // → 200n	
20n / 10n;    // → 2n	
23n % 10n;    // → 3n	
10n ** 3n;    // → 1000n	

const x = 10n;	
++x;          // → 11n	
--x;          // → 9n

复制代码

前端小智说:BigInt不支持一元加号运算符的缘由多是某些程序可能依赖于 + 始终生成Number的不变量,或者抛出异常。更改 +的行为也会破坏 asm.js代码。

隐式类型转换

由于隐式类型转换可能丢失信息,因此不容许在 bigint和 Number 之间进行混合操做。当混合使用大整数和浮点数时,结果值可能没法由 BigInt或 Number精确表示。

小数不能精准地转换为BigInt,大于Number范围的BigInt也不能准确地转换为数字,因此不容许两者存在隐式转换。

如果非要计算的话,须要强制转换一下

BigInt(10) + 10n;    // → 20n	

// 或者	

10 + Number(10n);    // → 20
复制代码

总结

BigInt是一种新的数据类型,能够表示超过Number范围的数字,防止超大整数出现的安全问题。此外还能够表示高分辨率的时间戳,使用大整数id等。

Number和BigInt操做数不能够隐式转换,计算时需显示转换。


参考出处: JS 最新数据基本类型:BigInt

相关文章
相关标签/搜索