在过去的 JavaScript 中,数字类型只能表示从 -2^53
到 2^53
范围内的整数,而对于更大的数字需使用第三方库进行处理。为了解决这个问题,ECMAScript 2020(也称为 ES11)引入了一种新的数字类型:BigInt。
什么是 BigInt?
BigInt 是一种全新的 JavaScript 数据类型,它可以表示任意精度的整数,不再受到数字范围的限制。BigInt 只是用于处理大数字,不能与数字类型交互。
例如,在过去的 JavaScript 中,我们可以用以下代码表示最大的整数:
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991 console.log(Number.MAX_SAFE_INTEGER + 1); // 9007199254740992 console.log(Number.MAX_SAFE_INTEGER + 2); // 9007199254740992
但是,在 BigInt 中,我们可以轻松表示一个数值达到十几个甚至几百个字符长的数字:
const bigIntNum = 1234567890123456789012345678901234567890n; console.log(bigIntNum); // 1234567890123456789012345678901234567890n
在上面的代码中,n
后缀表示一个 BigInt 字面量。
如何使用 BigInt?
BigInt 的语法与数字类型相似,但需要在整数后面添加一个 n
后缀。例如:
const bigIntNum = 1234567890123456789123456789123456789123456789123456789n; console.log(bigIntNum); // 1234567890123456789123456789123456789123456789123456789n
当对 BigInt 进行运算时,需要使用 BigInt 类型的方法,而不能使用数字类型的方法。例如:
const num1 = 12345678901234567890n; const num2 = 98765432101234567890n; console.log(num1 + num2); // 111111111111111111111n console.log(num1 - num2); // -864197532999999999999n console.log(num1 * num2); // 1219326321011014024971665724110123456780n console.log(num2 / num1); // 799999999.23232321407769840292n
需要注意的是,如果将 BigInt 赋值给数字类型,它将自动转换为 Number 类型,从而可能会丢失精度:
const bigIntNum = 12345678901234567890n; const num = bigIntNum; // 会变成普通的 Number 类型 console.log(num); // 12345678901234567888
因此,如果有需要对 BigInt 进行转换的,需要使用 Number()
函数进行转换。
支持 BigInt 的新方法
除了可以直接对 BigInt 进行数学运算以外,ES11 还引入了一些新的方法来处理 BigInt,例如:
1. 指数运算符
指数运算符是一个 **
符号,在 ES7 中已经存在。但是,在 BigInt 的情况下,它允许我们计算超大数字的幂,例如:
console.log(10n ** 100n); // 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000n
2. BigInt()
函数
BigInt()
函数用于将数字或字符串转换为 BigInt:
console.log(BigInt(123)); // 123n console.log(BigInt('123')); // 123n
3. BigInt.asUintN(width, n)
和 BigInt.asIntN(width, n)
函数
这两个函数用于将 BigInt 限制为 width
位,具体来说,BigInt.asUintN(width, n)
将整数转换为无符号 width
位整数,而 BigInt.asIntN(width, n)
将整数转换为 width
位带符号整数:
console.log(BigInt.asUintN(8, 255n)); // 255n,因为 255 能用 8 位二进制数表示 console.log(BigInt.asUintN(8, 256n)); // 0n,因为 256 无法用 8 位二进制数表示,超出限制范围,所以会截断,只取后 8 位 console.log(BigInt.asIntN(8, -256n)); // 0n,因为 -256 表示为二进制和 256 相同,并被限制在 8 位内 console.log(BigInt.asIntN(8, 255n)); // -1n,因为 255 在使用有符号 8 位二进制数表示时应该是 1111 1111,而这表示的是 -1
结论
BigInt 是 ES11 中的一项重大改进,它对 JavaScript 来说是一个巨大的进步。通过 BigInt,我们可以处理超出数字范围的大数值,从而在以前需要使用第三方库的情况下使开发更加便捷。但注意需要在转换时切记精度的问题,以免丢失了精度。
示例代码
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ---- - ---------------------- ---------------- - ------ -- ---------------------- ---------------- - ------ -- ----------------------- ---------------- - ------ -- ----------------------------------------- ---------------- - ------ -- ------------------------------- --------------- -- ------ -- ------------------------------------------------------------------------------------------------- ---------------------- - --------------- -- -------- ------------------------------------------- -- -------------------- ----------------------------- ------- -- ---- ----------------------------- ------- -- -- ---------------------------- -------- -- -- ---------------------------- ------- -- ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67093326d91dce0dc8774c24