在过去,JavaScript 的数字类型只有 Number 类型和其子类型,没有可以表示超过 Number 类型范围的数据类型。这一点对于前端开发者来说可能无法理解,但对于需要进行高精度计算的应用来说,这是一个极大的限制。
通过 ES10,新增了 BigInt 类型,该类型允许开发者表示任意大小的整数。BigInt 类型可以用于大型数据的精确计算,例如数学、加密等领域,这为 JavaScript 增加了许多功能。
本文将介绍 ES10 中的 BigInt,深入探讨其用法、性能以及实例演示,以便读者可以快速掌握相关知识。
BigInt 基础
BigInt 是一种可以存储大整数的数据类型,与 Number 不同,BigInt 可以表示任意精度的整数值。BigInt 构造函数接受一个字符串或数字类型参数作为整数的值。
const a = BigInt(12345678901234567890n); const b = BigInt('12345678901234567890');
需要注意的是,为了能够正确表示大整数,BigInt 类型需要在数字后面加上一个 n。不过在字符串定义的时候,不需要加上这个后缀。
对于在实际使用中,我们可以用简便的方式操作 BigInt:
const a = 12345678901234567890n; const b = '12345678901234567890';
BigInt 支持常见的数学运算操作。
加法
const sum = 123n + 100n; // 223n
减法
const difference = 100n - 50n; // 50n
乘法
const product = 100n * 55n; // 5500n
除法
BigInt 的除法返回的是一个整数,如果除数无法整除,将自动截尾。
const quo = 7n / 2n; // 3n
BigInt 还支持取余和幂等。
取余
const modulus = 9n % 2n; // 1n
幂等
const exp = 2n ** 3n; // 8n
BigInt 可以使用比较运算符,包括相等,不等,大于,小于,大于等于和小于等于。
相等
const isEqual = 100n === 100n; // true
不等
const isNotEqual = 1n !== 100n; // true
大于
const isGreater = 200n > 100n; // true
小于
const isLess = 2n < 10n; // true
大于等于
const isGreaterOrEqual = 99n >= 99n; // true
小于等于
const isLessOrEqual = 100n <= 101n; // true
BigInt 实用扩展
原生的 toString() 方法
与 Number 对象一样,BigInt 对象也有 toString() 方法。使用该方法可以将 BigInt 值转换为字符串。
const a = 12345678901234567890n; a.toString(); // "12345678901234567890"
类别判断
与 typeof 关键字不同,BigInt.bingInt(value) 方法可以有效判断任意值 value 是否为 BigInt 数值。
BigInt.isBigInt(100n); // true BigInt.isBigInt(200); // false BigInt.isBigInt(1.1); // false BigInt.isBigInt(false); // false
JSON 序列化
JavaScript 中的 JSON 不支持 BigInt 类型,但是在 JavaScript 对象包含 BigInt 类型属性的情况下,可以进行 JSON 序列化实际上将 BigInt 转为字符串。
JSON.stringify({ a: 12345678901234567890n }); // "{"a":"12345678901234567890"}"
类型转换
因为 BigInt 类型拥有更高的精度,因此如果使用 Number 类型的运算符和计算,BigInt 值会被强制转换为 Number 类型,导致精度丢失,因此应该尽量避免这种情况的发生。
BigInt 类型提供了三种类型转换方法,分别是 Number()、String()、Boolean(),都是将 BigInt 类型转为相应类型的行为。
const a = BigInt(123); Number(a); // 123 String(a); // "123" Boolean(a); // true
BigInt 性能
BigInt 类型的运行效率真的值得信任吗?实验证明,BigInt 消耗的资源比正常整数要高得多,因为它们需要更多的内存空间来存储。
在进行大规模计算的情况下,BigInt 运算速度很慢,不适用于复杂的计算和较长的数学运算。在小数据范围内,BigInt 使用相对较少的内存, 速度可以和其他数字类型相比。
在实际使用过程中,应该结合实际情况和需求选择合适的数据类型,权衡使用 BigInt 带来的高精度计算能力和性能带来的影响。
总结
ES10 的 BigInt 类型是 JavaScript 语言史上的里程碑式进步,它为前端开发者提供了更多的选择,高精度计算这一强项,为解决一些类似密码学问题提供了很大的帮助。大部分常规的运算符都可以应用在 BigInt 类型上。
但同时需要注意,BigInt 值的运算和转换都可能产生额外的开销,需要结合实际情况和需求选择合适的数据类型,最大限度地发挥其优势。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645060da980a9b385b970162