ECMAScript 2020 引入了 BigInt 类型,使 JavaScript 具有了处理大整数(超过 2^53-1)的能力,这是 JavaScript 原生没有的。BigInt 类型是一种新的数字类型,允许我们仅改变数字的位数,不改变数字的精度。
1. BigInt 类型的作用
在以往的 JavaScript 中,当需要处理大整数时,我们通常使用第三方库(如 bignumber.js)来实现。但是,这往往会给开发者带来一些问题,例如出现各种类型之间的转换和兼容问题。
因此,BigInt 类型的引入,使开发者可以更方便地处理大整数,而不必再依赖第三方库。
2. BigInt 类型的使用
BigInt 类型以一个后缀 n
结尾,例如:10n
。以下是 BigInt 类型的基本使用方法:
const a = 123456789012345678901234567890n; const b = BigInt("9876543210123456789"); const c = BigInt(9876543210123456789);
2.1. 常量
BigInt 类型支持的常量有:
- 二进制:以
0b
或0B
开始 - 八进制:以
0o
或0O
开始 - 十进制:以数字开始
- 十六进制:以
0x
或0X
开始
const a = 0b10110110n; // 182 const b = 0o774n; // 508 const c = 123456789012345678901234567890n; // 123456789012345678901234567890 const d = 0xabcdef0123456789n; // 18839874243712920635898893805017113
2.2. 运算
BigInt 类型支持的运算符有:+
、-
、*
、**
、/
、%
、&
、|
、^
、~
、<<
、>>
、>>>
。
-- -------------------- ---- ------- ----- - - -------------------------------- ----- - - ------------------ ------------- - --- -- ------------------------------- ------------- - --- -- ------------------------------- ------------- - --- -- ----------------------------------------------------- ------------- -- ---- -- -------------------------------------------------------------------------------------- ------------- - ---- -- ------------------------------- ------------- - ---- -- ------------------------------ ------------- - ----- -- -- ------------- - --- -- -------------- ------------- - --- -- ------------------------------- ------------- - --- -- ------------------------------- ---------------- -- -------------------------------- ------------- -- ---- -- ------------------------------- ------------- -- ---- -- ------------------------------ ------------- --- ---- -- ------------------------------
除此之外,BigInt 类型还支持相等和不相等运算符(==
和 !=
)、严格相等和不相等运算符(===
和 !==
)以及比较运算符(<
、<=
、>
和 >=
)。
-- -------------------- ---- ------- ----- - - -------------------------------- ----- - - -------------------------------- ------------- -- --- -- ----- ------------- -- --- -- ---- ------------- --- --- -- ----- ------------- --- --- -- ---- ------------- - --- -- ----- ------------- -- --- -- ----- ------------- - --- -- ---- ------------- -- --- -- ----
2.3. 转换
在使用 BigInt 类型时,我们需要注意以下几点:
- 不能使用
Number()
函数将 BigInt 类型转换为浮点数; - 不能使用
parseInt()
和parseFloat()
函数将 BigInt 类型转换为整数或浮点数,结果都为NaN
; - 可以使用
String()
、.toString()
和JSON.stringify()
将 BigInt 类型转换为字符串; - 可以使用
BigInt()
将字符串、数字、其他 BigInt 类型和类数组类型(如NodeList
和TypedArray
)转换为 BigInt 类型; - 可以使用
Number()
将 BigInt 类型转换为普通数字,但是可能会失精度。
以下是一些示例:
-- -------------------- ---- ------- ----- - - -------------------------------- ------------------ --- -- ------ ----- - - ---------- -- ---------- ------ ------- - ------ ----- -- - ------ --------------- ----- - - ------------ -- --- --------------- ----- - - ---------- ----- - - ------------- -------------- --- -- ------------------------------ ----- - - ------------------ --------------- -- -------------------------------- ----- - - ------------------------------- --------------- -- --------------------- ----- - - ----------------------------- --------------- -- ------------------------------------ ----- - - ---------------------------- --------------- -- -------------------- ----- - - ---------- -- ---- --------------- -- ---------- ------ ------- --------- -- ---- -- ------
3. 建议
尽管 BigInt 类型的引入使得 JavaScript 具备了处理大整数的能力,但是在实际使用时,仍需注意以下几点:
- 在使用
Number()
函数将 BigInt 类型转换为普通数字时,可能会丢失精度; - 在涉及到 BigInteger 的情况下,务必要确保代码充分测试,以避免意外的结果;
- 在使用 BigInt 类型时,需要保证代码的移植性,因为它是一个新引入的特性,可能不被所有的浏览器、引擎和环境支持。
4. 总结
BigInt 类型的引入使得 JavaScript 具备了处理大整数的能力,但在使用时,需要注意精度、测试和兼容性等问题。以下是一个示例代码:
const a = BigInt("12345678901234567890"); const b = BigInt("9876543210123456789"); console.log(a + b); // 12355555444444444444n
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ae77d648841e9894a894ff