ES中的BigInt数据类型

1,969 阅读4分钟

About BigInt

ES11 增加的一种最新的基础类型 BigInt ,在这之前,javascript 中表示数字的对象是 Number ,它可以表示64-bit 的浮点类型数字。一般来说 Number 已经够用了,但是如果在某些情况下需要对64-bit的整数进行存储或者运算,或者要表示的范围超过了64-bit的话,Number就不够用了。

BigInt数据类型提供了一种表示大于 2^53 - 1 整数的方法,能表示任意大的整数。

BigInts数据类型是通过在整数末尾附加 n 或调用构造函数 BigInt() 来创建的。

IE 不支持。

10n
BigInt(99) // ->99n

BigInt类型检测

可以使用 typeof 来查看 bigInt 的类型。要注意的是虽然 Number 和 BigInt 都代表的是数字,但是两者是不能混用的,不能将一个 Number 和一个 BigInt 相加。这会报TypeError异常。

如果非要进行操作,那么可以使用 BigInt 构造函数将 Number 转换成为 BigInt 之后再进行。

BigInt(3+4)  // 7n
BigInt(3) + BigInt(4). // 7n

// 数据类型检测
typeof 7n // 'bigint'
typeof BigInt(1) // 'bigint'

使用BigInt

一些运算

// 运算符  
// BigInt的数据类型进行运算时 只能跟同类型(BigInt)进行运算,否则会抛出TypeError
12n + 12n; // -> 24n 
12n - 2n;  // -> -10n 
12n * 12n; // -> 144n
20n / 10n; // -> 2n 
23n % 10n; // -> 3n  
10n ** 3n; // -> 1000n 
+12n;      // -> TypeError: Cannot convert a BigInt value to a number 
-12n;      // -> -12n 
const x = 12n; 
++x;       // -> 13n 
--x;       // -> 11n

//BigInt 转换为 Boolean
Boolean(12n)     // -> true
Boolean(0)       // -> false
Boolean(0n)      // -> false

// 使用 '/ '除操作
15n / 2n         // -> 7 

// 转String、Object类型
12n.toString()   // ->'12'
12.toString()    // ->'12'
Object(12n)      // -> BigInt {12n}
Object(12)       // -> Number {12}

// Number 和 BigInt 进行比较
2021n == 2021    // true
2021n === 2021   // false

当然,我们也是以通过 BigInt构造函数

BigInt(15) / BigInt(2)   // -> 7
Boolean(12n)             // -> true
String(12n)              // -> '12' 
BigInt(2021) == Number(2021)  // -> true
BigInt(10) * 10n;        // -> 100n

当 boolean 类型与BigInt 类型相遇时,BigInt 的处理方式与 number 类似,换句话说,只要不是 0n,BigInt ****就被视为真实的值

if (0n) {
    // 代码不会被执行
}
if (3n) {
    // 代码会被执行
}

排序BigIntsnumbers数组时,不会发生隐式类型转换:

const arr = [10n, 2n, 4, 6, 9, 1n, 0];
arr.sort();  // ->  [0, 1n, 10n, 2n, 4, 6, 9]

使用Math()

Math()方法是不能使用在BigInts中的

Math.abs(-2n);       // -> TypeError
Math.max(2n, 6n);    // -> TypeError
Math.round(2.56n);    // -> TypeError

最大安全整数 & 最小安全整数

Number表示的最大值是 2^53,也可以用Number.MAX_SAFE_INTEGER来表示;最小值是Number.MIN_SAFE_INTEGER

const min = Number.MIN_SAFE_INTEGER; // -9007199254740891
const max = Number.MAX_SAFE_INTEGER; // 9007199254740991

// number中
console.log(Number.MIN_SAFE_INTEGER - 100) 
 // -- 并不是我们想要的那个数 

// 使用BigInt
BigInt(Number.MIN_SAFE_INTEGER) - 100n  // 得到正确的结果 -9007199254741091n
BigInt(Number.MIN_SAFE_INTEGER) + 1000n // 9007199254741991n

注意

  • BigInt 能使用运算符 +、*、- 、** 和 %。
  • 除 >>> (无符号右移) 之外的 位操作 也可以支持。因为BigInt 都是有符号的。
  • BigInt 不支持单目 (+) 运算符,会报类型错误。
  • 不能对 BigInt 使用 Math 对象中的方法。
  • BigInt 不能与 Number数字 进行混合计算,否则,将抛出 TypeError。
  • 在将 BigInt 转换为 Boolean 时,它的行为类似 Number数字 。
  • BigInt 变量在转换成 Number 变量时可能会丢失精度。
  • typeof 操作时返回 bigint。
  • 使用 Object、String 等内置对象转换时,类似于 Number数字。
  • BigInt 使用 / 除操作时,带小数的运算会被取整。
  • Number 和 BigInt 可以进行比较,非严格相等。
  • JSON.stringify 处理 BigInt 会引发类型错误

总结

BigInt 是一种新的数据类型,用于当整数值大于 Number数据类型支持的范围时。这种数据类型允许我们安全地对大整数执行算术操作,表示高分辨率的时间戳,使用大整数id,等等,而不需要使用库。

重要的是,不能使用 NumberBigInt 操作数的混合执行算术运算,需要通过显式转换其中的一种类型。 此外,出于兼容性原因,不允许在 BigInt 上使用一元加号(+)运算符