ECMAScript 2021 中的 BigInts 详解:JavaScript 大数的新时代
在以往的 JavaScript 中,数字类型的最大值是 2^53 - 1,超出这个范围的数字会被转换成 Infinity。而在 ECMAScript 2021 中,新增了一种数据类型 BigInt,可以用来表示任意精度的整数,解决了 JavaScript 处理大数的痛点。本文将详细介绍 BigInt 的使用方法和注意事项,以及与其他数据类型的转换和运算。
一、BigInt 的基本用法
BigInt 是一种新的数据类型,用来表示任意精度的整数,可以用字面量或构造函数创建。字面量的格式是在数字后面加上 n 或 N,构造函数的参数可以是数字、字符串、BigInt 等。下面是一些示例代码:
const a = 123456789012345678901234567890n; // 字面量 const b = BigInt('98765432109876543210987654321'); // 构造函数 console.log(typeof a, a); // "bigint" 123456789012345678901234567890n console.log(typeof b, b); // "bigint" 98765432109876543210987654321n
需要注意的是,BigInt 和 Number 不能直接进行运算,需要通过 BigInt() 转换成 BigInt 类型才能进行运算。下面是一些示例代码:
const a = 123456789012345678901234567890n; const b = BigInt('98765432109876543210987654321'); console.log(a + b); // TypeError: Cannot mix BigInt and other types, use explicit conversions console.log(a + BigInt(b)); // 123456789012345679889888889211n console.log(Number(a) + b); // TypeError: Cannot mix BigInt and other types, use explicit conversions console.log(Number(a) + Number(b)); // 9.876543210987654e+28
二、BigInt 的注意事项
- BigInt 不能与 Number 相加减,需要先转换成相同类型再进行运算;
- BigInt 不能直接与字符串拼接,需要先转换成字符串再拼接;
- BigInt 不能用于位运算和 Math 对象的方法;
- BigInt 不能参与比较运算,需要使用 BigInt.asUintN() 或 BigInt.asIntN() 方法转换成相同位数的无符号整数或有符号整数再进行比较。
下面是一些示例代码:
-- -------------------- ---- ------- ----- - - -------------------------------- ----- - - ---------------------------------------- ------------- - --- -- ---------- ------ --- ------ --- ----- ------ --- -------- ----------- ------------- - ----------- -- ------------------------------- --------------------- - --- -- ---------- ------ --- ------ --- ----- ------ --- -------- ----------- --------------------- - ----------- -- --------------------- ------------- - ---- -- -------------------------------- ------------------ -- - ----- -- -------- ------------- - ---- -- ---------- ------ --- ------ --- ----- ------ --- -------- ----------- --------------------------- -- -------------------------------------------------------------------------------------------- ------------- - --- -- ---------- ------ ------- ------ ------ --- -------- ----- - ------------------------------- -- - ------------------- ---- -- ----- ------------------------------ -- - ------------------ ---- -- ----
三、BigInt 的运算和转换
BigInt 可以进行基本的数学运算,包括加、减、乘、除、取模等。需要注意的是,除法运算会向下取整,取模运算结果的符号与被除数相同。下面是一些示例代码:
const a = 123456789012345678901234567890n; const b = BigInt('98765432109876543210987654321'); console.log(a + b); // 123456789012345679889888889211n console.log(a - b); // 123456789012345678912321012569n console.log(a * b); // 1219326311370217954814576497552049353051373072677390n console.log(a / b); // 1249n console.log(a % b); // 12345678901234567890123456790n
BigInt 还可以进行位运算,包括与、或、异或、左移、右移等。需要注意的是,位运算符只能用于无符号 32 位整数,需要先将 BigInt 转换成 Number 再进行位运算。下面是一些示例代码:
-- -------------------- ---- ------- ----- - - -------------------------------- ----- - - ---------------------------------------- ------------- - --- -- ---------- ------ --- ------ --- ----- ------ --- -------- ----------- --------------------- - ----------- -- -------- ------------- - --- -- ---------- ------ --- ------ --- ----- ------ --- -------- ----------- --------------------- - ----------- -- ---------- ------------- - --- -- ---------- ------ --- ------ --- ----- ------ --- -------- ----------- --------------------- - ----------- -- ---------- ------------- -- ---- -- ---------- ------ --- ------ --- ----- ------ --- -------- ----------- --------------------- -- --- -- ------------------------------- ------------- -- ---- -- ---------- ------ --- ------ --- ----- ------ --- -------- ----------- --------------------- --- --- -- -----------------------------
BigInt 还可以与其他数据类型进行转换,包括 Number、字符串和布尔值。需要注意的是,如果转换成 Number,超出安全整数范围的 BigInt 会被转换成 Infinity 或 -Infinity。下面是一些示例代码:
-- -------------------- ---- ------- ----- - - -------------------------------- ----------------------- -- -------- -------------------------- -- -------------------------------- ----------------------- -- -------------------------------- ------------------------ -- ---- ------------------------- -- -----
四、BigInt 的应用场景
BigInt 的主要应用场景是处理大数计算,例如密码学、数论、高精度计算等。在以往的 JavaScript 中,处理大数计算需要借助第三方库,例如 BigInteger.js、bignumber.js 等。而在 ECMAScript 2021 中,BigInt 提供了原生支持,可以减少代码量和依赖库。下面是一个示例代码,使用 BigInt 计算 100 的阶乘:
-- -------------------- ---- ------- -------- ------------ - --- ------ - --- --- ---- - - --- - -- -- ---- - ------ -- -- - ------ ------- - ---------------------------- -- ---------------------------------------------------------------------------------------------------------------------------------------------------------------
五、总结
BigInt 是 ECMAScript 2021 中新增的一种数据类型,用来表示任意精度的整数。BigInt 可以进行基本的数学运算和位运算,还可以与其他数据类型进行转换。需要注意的是,BigInt 不能与 Number 直接进行运算和比较,也不能用于位运算和 Math 对象的方法。BigInt 的主要应用场景是处理大数计算,例如密码学、数论、高精度计算等。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65dde3bb1886fbafa4b34667