什么是BigInt
在ES6中,BigInt是一种新的数据类型,用于当整数值大于Number数据类型支持的范围时。安全地对大整数执行算术操作。
为什么需要BigInt?
我们知道,js是一门弱类型语言,在ES6之前,所有的数字都是Number类型,都是以双精度64位浮点格式表示,并不像java那样有int,float等,那这样会带来什么问题呢?
这会导致js中的Number无法精确表示非常大的整数,它会将非常大的整数四舍五入,准确的数,js的Number类型只能安全的表示-9007199254740991(-(2^53-1))和9007199254740991(2^53-1),任何超出此范围的整数值都可能失去精度。
js
console.log(999999999999999); //=>10000000000000000
同时,也会有一定的安全性问题
js
9007199254740992 === 9007199254740993; // → true 居然是true!
如何创建并使用BigInt?
- 要创建BigInt,只需要在数字米未追加n即可
js
console.log( 90071992547409884n ); // → 90071992547409884n
console.log( 9007199254740995 ); // → 9007199254740996
2.使用BigInt构造函数
js
BigInt("9007199254740995"); // → 9007199254740995n
简单的使用如下
js
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
console.log(typeof x); //"bigint"
需要注意的是:
1)BigInt不支持一元加号运算符, 这可能是某些程序可能依赖于 + 始终生成 Number 的不变量,或者抛
出异常。另外,更改 + 的行为也会破坏 asm.js代码。
2)因为隐式类型转换可能丢失信息,所以不允许在bigint和 Number 之间进行混合操作。当混合使用大
整数和浮点数时,结果值可能无法由BigInt或Number精确表示。
3)不能将BigInt传递给Web api和内置的 JS 函数,这些函数需要一个 Number 类型的数字。尝试这样
做会报TypeError错误。
js
console.log(999999999999999); //=>10000000000000000
9007199254740992 === 9007199254740993; // → true 居然是true!
console.log( 9007199254740995n ); // → 9007199254740995n
console.log( 9007199254740995 ); // → 9007199254740996
BigInt("9007199254740995"); // → 9007199254740995n
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
console.log(typeof x); //"bigint"
10 + 10n; // → TypeError
Math.max(2n, 4n, 6n); // → TypeError
4)当 Boolean 类型与 BigInt 类型相遇时,BigInt的处理方式与Number类似,换句话说,只要不是
0n,BigInt就被视为true
js
if(0n){//条件判断为false
}
if(3n){//条件为true
}
5)元素都为BigInt的数组可以进行sort。
6)BigInt可以正常地进行位运算,如|、&、<<、>>和