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 | const a = BigInt(9007199254740991); // 9007199254740991n |
BigInt()
不是构造函数,因此不能使用new
操作符。如果向BigInt
函数中错误的传递值,会导致报错。如:
1 | const c = BigInt("hhh"); // SyntaxError |
2.类型检测
对BigInt
类型的变量执行typeof
操作,会返回bigint。
1 | const h = BigInt(9007199254740993); |
3.运算
BigInt
支持常见的运算符。二元运算 +
, -
, *
, 和 **
都可以正常使用。 /
和 %
可以使用,并根据需要向零取整。
1 | const i = BigInt(9007199254740991); |
BigInt
类型不能与其他类型的值混合运算、不能和Math
对象中的方法一起使用否则会报错,如:1 | 5n + 2; // TypeError |
4.比较与转换
BigInt
和Number
不是严格相等的,但是是宽松相等的。并且BigInt
与其他类型的变量做比较和转换时,其转换规则与Number
一致。
1 | 0n == 0; // true |
注意, BigInt
变量在转换成Number
变量时可能会丢失精度。如:
1 | Number(1234567890123456789n * 123n); // 151851850485185200000 |
三、API
1.BigInt()函数
BigInt()
函数将其参数转换为BigInt
。如果转换失败,它抛出一个SyntaxError
或RangeError
异常。
1 | BigInt(123); // 123n |
2.两个库函数
BigInt.asIntN(width,value)
将一个BigInt
值包装为一个width
位的二进制有符号整数。BigInt.asUintN(width,value)
将一个BigInt
值包装为一个width
位的二进制无符号整数。例如,如果您正在执行64位算术,
1 | const j = 2n ** 63n - 1n; |
BigInt
超过64位整数范围的值,就会发生溢出。3.两种新的类型数组
BigInt64Array
和BigUint64Array
让我们更容易且高效地表示和操作64位有符号和无符号整数组成的列表。
1 | const k = new BigInt64Array(4); // [0n, 0n, 0n, 0n] |
1 | const n = 2n ** 63n - 1n; |
BigInt64Array
确保这些值是有符号的。BigUint64Array
确保这些值是无符号的。