BigInt 是处理超安全整数范围整数的唯一可靠方式,需用 n 后缀或 BigInt() 创建,不与 Number 混用,支持特定运算但不兼容 JSON 和 Math 方法,工程中应尽早统一类型并校验。

JavaScript 的 BigInt 是处理超出 Number.MAX_SAFE_INTEGER(即 9007199254740991)范围的整数运算的唯一可靠方式,尤其适用于加密计算、高精度计时、区块链地址运算、大ID生成等场景。它不是 Number 的子类型,不能与普通数字混用,必须显式声明和转换。
BigInt 的创建与基本使用规范
必须通过字面量后缀 n 或 BigInt() 构造函数创建,不可使用 new BigInt()(会报错)。所有参与运算的操作数都需为 BigInt 类型,否则会抛出 TypeError。
-
const a = 123n;✅ 推荐:简洁、明确、性能好 -
const b = BigInt("9007199254740992");✅ 支持字符串输入(避免 Number 精度丢失) -
const c = BigInt(123);✅ 支持小整数 Number 转换(仅限安全整数范围) -
const d = 123 + 456n;❌ 报错:禁止隐式类型混合
算术与比较操作的注意事项
BigInt 支持 +、-、*、**、%、>>、<< 等运算符,但不支持 / 的浮点除法——只支持 向零截断的整数除法(结果仍是 BigInt)。比较时,== 和 === 均可安全使用(类型不同则为 false),但 >、< 等关系运算符允许与 Number 混用(仅当 Number 在安全整数范围内,否则行为未定义)。
-
100n / 3n === 33n✅ 结果向下取整(向零截断) -
100n > 99✅ 允许 Number 参与比较(99 自动转为 99n) -
100n > Number.MAX_SAFE_INTEGER + 1⚠️ 不推荐:右侧已丢失精度,应统一转为 BigInt 比较 -
10n ** 100n✅ 支持大指数幂运算(无溢出问题)
与 JSON、ArrayBuffer 和常见 API 的兼容性处理
BigInt 无法直接序列化为 JSON(JSON.stringify(123n) 抛错),也不被 TypedArray(如 Uint8Array)原生支持。需手动转换或封装。
立即学习“Java免费学习笔记(深入)”;
- JSON 序列化:建议统一转为字符串(
String(123n))或自定义 replacer - 二进制操作:用
BigInt.asUintN(bits, value)/asIntN截断位宽;转 ArrayBuffer 需手动拆解为字节数组(如用value.toString(16)再 hex→bytes) - Math 方法:全部不支持(
Math.pow、Math.max等均拒绝 BigInt),需用对应 BigInt 运算替代 - Array.prototype 方法:
map、reduce等可用,但回调中需确保返回 BigInt 类型以维持类型一致性
实际工程中的最佳实践建议
在涉及长数字的业务中(如 Web3 地址哈希、时间戳纳秒级精度、分布式 ID),应尽早确立 BigInt 使用边界,避免运行时类型错误。
- 输入层(如 API 响应、URL 参数)优先接收字符串,再用
BigInt(str)解析,杜绝parseInt(str) + 'n'类错误 - 数据库交互时,若后端返回大整数字符串(如 GraphQL 中的
"12345678901234567890"),前端应立即转为 BigInt 并全程保持类型纯净 - 不要依赖
typeof x === 'bigint'做兜底判断后再运算——应在数据流入时就完成类型校验与转换 - 注意浏览器兼容性:IE 完全不支持,Safari 14+、Chrome 67+、Firefox 68+ 支持;必要时用
typeof BigInt !== 'undefined'特性检测降级










