在 JavaScript 中,存储数字的最大值有限制。在运算过程中,超过这个限制的数字将出现精度丢失等问题。ES11 引入了 BigInt 类型,可以有效应对这种情况。
什么是 BigInt 类型?
BigInt 是一种全新的数据类型,用于存储任意长度的整数。相较于 Number 类型,BigInt 类型可以存储更大的整数,且没有精度限制。BigInt 类型以 "n" 结尾,以区别于普通的 Number 类型。
BigInt 类型的优势
支持更大的整数
在原本的 Number 类型中,能够精确表示的最大整数值为 Number.MAX_SAFE_INTEGER (即 2 的 53 次幂 - 1)。在超过这个范围的数字进行运算时,很可能会出现精度丢失的问题。 BigInt 类型可以存储更大的整数值,无需担心精度丢失。
更加准确的计算结果
在 Number 类型中,一些复杂的运算结果可能会出现精度丢失的问题。而 BigInt 类型可以对整数进行精确的运算,并且返回准确的结果。下面是一个 BigInt 类型的加法示例代码:
const bigNum1 = BigInt(Number.MAX_SAFE_INTEGER) const bigNum2 = BigInt(Number.MAX_SAFE_INTEGER) const sum = bigNum1 + bigNum2 console.log(sum)
输出结果为:
18014398509481982n
更高的安全性
由于 Number 类型的范围有限,因此攻击者可以通过超出这个范围的数值来进行一些攻击。而 BigInt 类型可以存储更大的整数值,因此可以有效减少这种攻击的可能性。
BigInt 类型的局限性
虽然 BigInt 类型有很多的优势,但是在使用的过程中需要注意以下几个点。
不能与 Number 类型混合计算
由于 BigInt 类型和 Number 类型的存储方式不同,因此它们之间不能互相计算。试图将 BigInt 类型和 Number 类型进行混合运算,会导致语法错误。
不能与普通的字符串直接拼接
和 Number 类型一样, BigInt 类型也不能和字符串直接进行拼接。需要将 BigInt 类型转换为字符串后再进行拼接。
基本运算需要使用 BigInt 构造函数
BigInt 类型的基本运算,需要使用 BigInt 构造函数或者在整数末尾加上 "n" 后缀。如果直接使用字符串或者 Number 类型进行赋值,将导致 BigInt 类型的错误。
示例代码
以下是一个使用 BigInt 类型的示例代码。
const a = BigInt(Number.MAX_SAFE_INTEGER) const b = BigInt(Number.MAX_SAFE_INTEGER) const c = a * b console.log(c) const d = BigInt("9223372036854775808") const e = BigInt("9223372036854775808") const f = d + e console.log(f)
输出结果:
8307674973655724200n 18446744073709551616n
总结
BigInt 类型是一个能够存储更大的整数值,并且可以进行精确计算的数据类型。在实际开发中,如果要处理大整数的运算,可以尝试使用 BigInt 类型。注意其局限性,如果需要进行混合运算,需要进行类型转换。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659f13b6add4f0e0ff7c4888