在 ES11 中,新增了一个名为 BigInt
的数据类型,意味着 JavaScript 已经支持了大整数计算,且可保存更大范围的整数。在我们解决一些日常的数据处理问题时,这个新的 BigInt 类型可能会很有用,甚至可以替代掉之前我们所熟悉的 Number 类型。
什么是 BigInt 类型?
在 JavaScript 中, 除了 BigInt 类型以外的其他数字类型都是以固定的位数表示和存储数字。而 BigInt 类型则允许我们使用任何位数表示和存储数字。这使得 BigInt 类型支持的最大数值远远超过了 Number 类型,实际上,它可以表示任何我们需要的整数,无论它有多大。
在 BigInt 中,数字后面可以使用 n
后缀或者 BigInt()
构造函数来声明一个 BigInt 类型的数字。
const tooBig = 1234567890123456789012345678901234567890n; console.log(tooBig); // 1234567890123456789012345678901234567890n const anotherBigInt = BigInt(42); console.log(anotherBigInt); // 42n
使用 BigInt 类型做整数运算
在 JavaScript 中,我们可以对 BigInt 数据类型进行各种算术运算。
const a = 1234567890123456789012345678901234567890n; const b = BigInt(9876543210987654321098765432109876543210); console.log(a + b); // 11111111111111111100123456788888888888800n console.log(b - a); // 8641975320864197532064197532108641975320n console.log(a * b); // 12193263113702179581036711309995906617207055441022975448941315666300942332600n console.log(b / a); // 797999.96941693495600066338584913836559641n
在以上示例中,你会注意到我们对 BigInt 类型数据进行了一些常见的算术运算,比如 +
、 -
、 *
和 /
。要注意一点的是,BigInt 类型的算术运算采用了类似于普通数字运算的语法规则,但是 JavaScript 会根据 BigInt 类型数据来做出不同的计算结果。
BigInt 类型和 Number 类型之间的转换
在 JavaScript 中,如果我们想要将 BigInt 类型转换成 Number 类型,我们只需要使用 Number() 函数进行转换。但是,需要注意的是,如果 BigInt 类型的数据在转换成 Number 数据类型的过程中超出了 Number 类型的表示范围,那么就会损失精度。
const a = 1234567890123456789012345678901234567890n; const b = Number(a); // 1.2345678901234568e+39
同样的,如果我们想要将 Number 类型的数据转换成 BigInt 类型,我们可以在数字后面添加 n
后缀或者使用 BigInt() 构造函数来进行转换。但是同样需要注意的是,如果 Number 类型的数据在转换成 BigInt 类型的过程中超出了 BigInt 类型可表示范围,会导致数据丢失一部分精度。
const a = 123456789012345678901234567890; const b = BigInt(a); // 123456789012345678901234567890n
BigInt 类型和字符串之间的转换
和 Number 类型和字符串之间的通常操作类似,我们也可以用 String() 函数把 BigInt 类型转换为字符串类型。在 BigInt 类型的数据后面添加一个空的字符串也可以实现这个操作。
const a = 1234567890123456789012345678901234567890n; console.log(String(a)); // "1234567890123456789012345678901234567890" console.log(a + ""); // "1234567890123456789012345678901234567890"
如果我们有一个字符串类型的数据,我们可以使用 BigInt() 构造函数来将其转换为 BigInt 类型。在使用 BigInt() 函数进行转换之前,我们需要确保这个字符串数据中不会出现任何超出 BigInt 类型表示范围的数字。
const a = "1234567890123456789012345678901234567890"; console.log(BigInt(a)); // 1234567890123456789012345678901234567890n
在以上示例中,我们使用 BigInt() 构造函数实现了字符串类型和 BigInt 类型之间的转换,转换成果期望的 1234567890123456789012345678901234567890n。
BigInt 类型的应用场景
现实生活中,我们会遇到许多需要处理非常大的数字的问题。例如,我们需要在加密/解密、数据流中进行优化、处理密码等领域中使用如此高的精度。但是,在很多情况下,我们使用基础的 Number 类型可能显得力不从心。
请看以下代码片段:
const maxNumber = Number.MAX_SAFE_INTEGER; console.log(maxNumber); // 9007199254740991 const almostExceedMaxNumber = maxNumber + 1; console.log(almostExceedMaxNumber); // 9007199254740992 const beyondMaxNumber = Number.MAX_SAFE_INTEGER * 2; console.log(beyondMaxNumber); // 18014398509481982
在以上代码片段中,我们可以看出 Number 类型对数字的极限。超出 Number 的最大有限值时,运算得到的结果就不是预期的结果。这时候 BigInt 类型就可以派上用场了。
在以下示例中,我们尝试在原基础上添加一个数值:
let money = BigInt(2000) money += BigInt(3000) console.log(money) // 5000n
在以上示例中,我们可以看到通过 BigInt 类型处理整数计算,可以得到预期的结果。同时,如果您在使用任何第三方数字处理库时,都可以考虑使用 BigInt 类型来代替 Number 类型处理整数计算。
总结
了解 BigInt 类型是使用 JavaScript 开发时很重要的一点。 BigInt 类型的出现意味着我们不再受限于 Number 类型。它使得我们能够处理远远超过 JavaScript 中默认数字上限的数字,是在数字处理领域中一次巨大的进步。
虽然 BigInt 类型目前还不是很常见,但是它可以让我们更方便地去解决一些非常大的数字问题。它不仅对开发人员在计算机科学领域,还有特定领域的开发人员都非常重要,如密码学、科学计算和金融等。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fff09095b1f8cacde2d89d