BigInt

BigInt是JavaScript中一个新的基本数据类型,使用BigInt可以安全地存储和操作大整数,即使这个数已经超出了Number能够表示的安全整数范围。本文将介绍BigInt的用法以及其与Number的区别。

一、前言

我们知道,在JavaScript中,Number有一个最大安全整数,即其可以准确表达的最大数字,如下所示

1
Number.MAX_SAFE_INTEGER; // 9007199254740991 
,超过该数,便不能安全的进行存储和操作。比如说:2 ** 53 + 1 == 2 ** 53会返回true,这显然是不正确的。于是乎,BigInt就从天而降,BigInt可以用任意精度表示整数,可以正确执行整数运算而不会溢出。

二、语法

1.创建BigInt

创建BigInt有两种方式,第一种方式是BigInt(value)函数,其中value为整数或字符串;第二种方式是在一个整数字面量后面加n。如:

1
2
const a = BigInt(9007199254740991);  // 9007199254740991n
const b = 9007199254740991n; // 9007199254740991n
注意, BigInt()不是构造函数,因此不能使用new操作符。

如果向BigInt函数中错误的传递值,会导致报错。如:

1
2
3
4
5
const c = BigInt("hhh"); // SyntaxError
const d = BigInt(25.23); // RangeError
const e = BigInt("12ab"); // SyntaxError
const f = 1.5n; // SyntaxError
const g = BigInt(); // TypeError

2.类型检测

BigInt类型的变量执行typeof操作,会返回bigint。

1
2
const h = BigInt(9007199254740993); 
typeof h; // "bigint"

3.运算

BigInt支持常见的运算符。二元运算 +, -, *, 和 ** 都可以正常使用。 /% 可以使用,并根据需要向零取整。

1
2
3
4
5
const i = BigInt(9007199254740991); 
i + 1n; // 9007199254740992n
i - 2n; // 9007199254740989n
i * 2n; // 18014398509481982n
5n / 2n; // 2n
需要注意的是BigInt类型不能与其他类型的值混合运算、不能和Math对象中的方法一起使用否则会报错,如:
1
2
5n + 2;  // TypeError
Math.pow(2n, 3n); // TypeError

4.比较与转换

BigIntNumber不是严格相等的,但是是宽松相等的。并且BigInt与其他类型的变量做比较和转换时,其转换规则与Number一致。

1
2
3
0n == 0;  // true
0n === 0; // false
1n < 2; // true

注意, BigInt变量在转换成Number变量时可能会丢失精度。如:

1
Number(1234567890123456789n * 123n);  // 151851850485185200000
结果就很明显不正确。

三、API

1.BigInt()函数

BigInt()函数将其参数转换为BigInt。如果转换失败,它抛出一个SyntaxErrorRangeError异常。

1
2
3
BigInt(123);    // 123n
BigInt(1.5); // RangeError
BigInt('1.5'); // SyntaxError

2.两个库函数

BigInt.asIntN(width,value)将一个BigInt值包装为一个width位的二进制有符号整数。BigInt.asUintN(width,value) 将一个BigInt值包装为一个width位的二进制无符号整数。例如,如果您正在执行64位算术,

1
2
3
const j = 2n ** 63n - 1n;
BigInt.asIntN(64, j); // 9223372036854775807n
BigInt.asIntN(64, j + 1n); // -9223372036854775808n
则只要我们给传递BigInt超过64位整数范围的值,就会发生溢出。

3.两种新的类型数组

BigInt64ArrayBigUint64Array让我们更容易且高效地表示和操作64位有符号和无符号整数组成的列表。

1
2
3
4
5
6
const k = new BigInt64Array(4);  // [0n, 0n, 0n, 0n]
const l = 2n ** 63n - 1n;
const m = new BigInt64Array(2);
m[0] = l;
m[1] = l + 1n;
m; // [9223372036854775807n, -9223372036854775808n]
1
2
3
4
5
const n = 2n ** 63n - 1n;
const o = new BigUint64Array(2);
o[0] = n;
o[1] = n + 1n;
o; // [9223372036854775807n, 9223372036854775808n]
BigInt64Array确保这些值是有符号的。BigUint64Array 确保这些值是无符号的。

四、参考链接

  1. BigInt:JavaScript 中的任意精度整数
  2. MDN
--本文结束 感谢阅读--
创作十分不易,原创更应鼓励