在前端开发中,我们经常需要处理很大的数字,比如加密算法、时间戳等等。但是 JavaScript 的 Number 类型对于精度有限制,当数字过大时就会出现精度损失的问题,而 ES8 中新增的 BigInt 类型则可以解决这个问题。
什么是 BigInt 类型?
BigInt 类型是 ES8 中新增的一种数据类型,它可以处理任意精度的整数,而且没有精度限制。在代码中,BigInt 类型的数值必须以 N 结尾,例如:
const num = 1234567890123456789012345678901234567890n;
如何进行 BigInt 的计算?
与 Number 类型不同,BigInt 类型不能与其他类型进行运算,例如:
const num1 = 123n; const num2 = 456; const result = num1 + num2; // 报错
要进行 BigInt 的计算,必须使用 BigInt() 函数将数字转换成 BigInt 类型,例如:
const num1 = BigInt(123); const num2 = 456n; const result = num1 + num2; // 579n
同时还可以使用 BigInt 类型的方法进行计算,例如:
- 加法:
const num1 = 123n; const num2 = 456n; const result = num1 + num2; // 579n
- 减法:
const num1 = 456n; const num2 = 123n; const result = num1 - num2; // 333n
- 乘法:
const num1 = 123n; const num2 = 456n; const result = num1 * num2; // 56088n
- 除法:
const num1 = 456n; const num2 = 123n; const result = num1 / num2; // 3n
当然,也可以使用 BigInt 类型的属性和方法进行操作:
- 最大值:
const maxNum = Number.MAX_SAFE_INTEGER; const bigIntNum = BigInt(maxNum) + BigInt(1); console.log(bigIntNum); // 9007199254740993n
- 转化成 Number 类型:
const num1 = 12345678901234567890n const num2 = Number(num1); // 报错 const num3 = BigInt.asUintN(32, num1); // 转换为 Uint32 类型 console.log(num3); // 289669976
BigInt 与 Number 的转换
由于 BigInt 类型不能与 Number 类型进行运算,所以在使用 BigInt 进行计算后,可能需要将结果转换成 Number 类型进行后续的操作。同时也需要注意 BigInt 转换成 Number 时可能会出现精度丢失的问题。
- BigInt 转为 Number:
const BigIntNum = 1234567890123456789012345678901234567890n; const NumberNum = Number(BigIntNum); // 报错 const NumberNum2 = BigInt.asUintN(32, BigIntNum); // 转换为 Uint32 类型 console.log(NumberNum2); // 289669976
- Number 转为 BigInt:
const NumberNum = 1234567890123456789; const BigIntNum = BigInt(NumberNum); console.log(BigIntNum); // 1234567890123456789n
总结
BigInt 类型是 ES8 新增的一种数据类型,它可以处理任意精度的整数。在进行 BigInt 的计算时,要注意使用 BigInt() 函数将数字转换成 BigInt 类型,并且使用 BigInt 类型的方法进行计算。在 BigInt 和 Number 类型相互转换时,需要注意精度丢失的问题。使用 BigInt 类型可以避免处理大数字时出现的精度问题,为前端开发提供了更多的实现可能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e83740f6b2d6eab33b66b8