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) {
// 代码会被执行
}
排序BigInts和 numbers数组时,不会发生隐式类型转换:
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,等等,而不需要使用库。
重要的是,不能使用 Number 和 BigInt 操作数的混合执行算术运算,需要通过显式转换其中的一种类型。 此外,出于兼容性原因,不允许在 BigInt 上使用一元加号(+)运算符