• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共299篇

    前端 - Javascript

关闭

返回栏目

关闭

返回前端 - Javascript栏目

99 - 内置对象 - BigInt 对象 - 大整数与普通数值的区别

作者:

贺及楼

成为作者

更新日期:2025-02-21 18:58:39

前端 - Javascript 《内置对象 - BigInt 对象 - 大整数与普通数值的区别》

在 JavaScript 的世界里,数值的处理是日常开发中不可或缺的一部分。通常情况下,我们使用普通的 Number 类型来处理数值,但当遇到非常大的整数时,Number 类型就显得力不从心了。这时,ES2020 引入的 BigInt 对象就派上了用场。本文将详细探讨大整数(BigInt)与普通数值(Number)的区别。

基本概念

普通数值(Number)

在 JavaScript 中,Number 类型是基于 IEEE 754 双精度 64 位浮点数标准实现的。这意味着它可以表示的数值范围是有限的,其安全整数范围是 -(2^53 - 1)2^53 - 1,即 -90071992547409919007199254740991。超出这个范围,数值的精度就会受到影响。

大整数(BigInt)

BigInt 是一种新的数值类型,用于表示任意大的整数。你可以通过在整数后面添加 n 或者使用 BigInt() 构造函数来创建 BigInt 类型的值。BigInt 可以处理任意大的整数,不受 Number 类型安全整数范围的限制。

区别对比

1. 表示范围

类型 表示范围 示例
Number -(2^53 - 1)2^53 - 1 const num = 9007199254740991;
BigInt 任意大的整数 const bigInt = 9007199254740992n;

下面的代码展示了 Number 类型超出安全整数范围时的精度问题:

  1. const num = 9007199254740992;
  2. console.log(num); // 输出: 9007199254740992
  3. console.log(num + 1); // 输出: 9007199254740992,精度丢失
  4. const bigInt = 9007199254740992n;
  5. console.log(bigInt); // 输出: 9007199254740992n
  6. console.log(bigInt + 1n); // 输出: 9007199254740993n,结果正确

2. 类型判断

可以使用 typeof 运算符来判断一个值的类型:

  1. const num = 10;
  2. const bigInt = 10n;
  3. console.log(typeof num); // 输出: "number"
  4. console.log(typeof bigInt); // 输出: "bigint"

3. 运算规则

BigIntNumber 不能直接进行混合运算,否则会抛出 TypeError 错误。需要将它们转换为相同的类型后再进行运算。

  1. const num = 10;
  2. const bigInt = 10n;
  3. // 以下代码会抛出 TypeError
  4. // const result = num + bigInt;
  5. // 正确的做法是将它们转换为相同的类型
  6. const result1 = num + Number(bigInt); // 将 BigInt 转换为 Number
  7. const result2 = BigInt(num) + bigInt; // 将 Number 转换为 BigInt
  8. console.log(result1); // 输出: 20
  9. console.log(result2); // 输出: 20n

4. 方法和属性

Number 类型有一些内置的方法和属性,如 toFixed()isNaN() 等,而 BigInt 类型也有自己的一些方法,如 toString()。但它们的方法和属性并不完全相同。

  1. const num = 10.25;
  2. const bigInt = 10n;
  3. console.log(num.toFixed(1)); // 输出: "10.2"
  4. console.log(bigInt.toString()); // 输出: "10"

5. 与 JSON 的交互

JSON 不支持直接序列化 BigInt 类型的值。如果尝试将包含 BigInt 的对象进行 JSON.stringify() 操作,会抛出 TypeError 错误。

  1. const obj = {
  2. bigInt: 10n
  3. };
  4. // 以下代码会抛出 TypeError
  5. // const jsonStr = JSON.stringify(obj);
  6. // 可以自定义转换函数来处理
  7. const jsonStr = JSON.stringify(obj, (key, value) => {
  8. return typeof value === 'bigint'? value.toString() : value;
  9. });
  10. console.log(jsonStr); // 输出: '{"bigInt": "10"}'

适用场景

  • 普通数值(Number):适用于大多数日常的数值计算,如处理价格、年龄等在安全整数范围内的数值。
  • 大整数(BigInt):适用于需要处理非常大的整数的场景,如密码学、高精度计算等。

总结

BigInt 对象为 JavaScript 带来了处理任意大整数的能力,弥补了 Number 类型在表示范围上的不足。在实际开发中,我们需要根据具体的需求选择合适的数值类型,避免因数值范围和精度问题导致的错误。同时,要注意 BigIntNumber 在运算规则、与 JSON 交互等方面的差异,确保代码的正确性和稳定性。