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 确保这些值是无符号的。
