它是个什么东西?
乍一看,一个新的基本数据类型,大个儿的Int?那么这个大个的Int究竟是干什么的呢?
作用: BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值。
所以说它是个大个儿的Int完全没得问题,在对z大整数执行数学运算时,以任意精度表示整数的能力尤为重要,使用BigInt,整数溢出将不再是问题。
此外,可以安全地使用更加准确时间戳,大整数ID等,而无需使用变通方法。
为什么需要BigInt?
在JS中,所有的数字都以双精度64位浮点格式表示,那带来的问题是什么呢!?
没错,JS中的Number无法精确表示非常大的整数,它会将非常大的整数四舍五入,确切地说,JS中的Number类型只能安全地表示-9007199254740991(-(2^53-1))和9007199254740991((2^53-1)),任何超出此范围的整数值都可能失去精度
console.log(999999999999999); //=>10000000000000000
这就会带来一定的安全问题,比如:
// 注意最后一位的数字
9007199254740992 === 9007199254740993; // → true
创建BigInt
要创建BigInt,只需要在数字末尾追加n即可。 注:chrome 67+开始支持BigInt。
console.log( 9007199254740995n ); // → 9007199254740995n
console.log( 9007199254740995 ); // → 9007199254740996
这就在一定程度上解决了Number四舍五入的问题
另一种创建BigInt的方法是用BigInt()构造函数
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