bigint 是独立于 number 的严格类型化整数类型,专为安全处理超大整数设计;它与 number 不能直接运算或比较,需显式转换,且多数 api 和 json 不原生支持,转换存在精度风险。

JavaScript 中 BigInt 不是 Number 的增强版,而是一个独立、严格类型化的整数类型,它的设计目标很明确:安全处理超大整数。正因如此,它在使用上有一系列不可绕过的限制,不是“加个 n 就能用”,而是必须主动适配规则。
算术运算必须类型一致
BigInt 和 Number 不能直接参与任何算术运算(+、−、*、/、%、**),语言会立即抛出 TypeError,这是硬性约束,不是警告。
-
10n + 5→ 报错:“Cannot mix BigInt and other types” -
10n * 2.5→ 报错:浮点数更不允许参与 - 正确写法只有两种:
10n + 5n或10n + BigInt(5) - 注意:
BigInt(5.5)会报错,构造函数只接受整数或整数字符串
比较操作需区分语义
大小比较(、<code>>、===)对类型敏感,但行为不统一,容易踩坑。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
10n === 10→false(类型不同,严格相等不成立) -
10n == 10→ 当前多数引擎返回true,但该行为已被规范标记为“不推荐”,未来可能移除 -
10n > 9→true(允许跨类型比较,但仅限整数值;10n > 9.5会报错) - 数组排序时混合类型(如
[4n, 6, -12n])会自动按数值大小排序,但结果顺序依赖引擎实现,不建议依赖
API 和序列化支持有限
绝大多数内置方法和标准接口未原生支持 BigInt,必须手动桥接。
-
Math.max(10n, 20n)→ 报错;应转为Math.max(Number(10n), Number(20n))(仅当值 ≤Number.MAX_SAFE_INTEGER时安全) -
JSON.stringify({ id: 123n })→ 抛出TypeError;需预处理:JSON.stringify({ id: 123n.toString() }) - 反序列化时需自定义 reviver:
JSON.parse(json, (k, v) => typeof v === 'string' && /^\d+$/.test(v) ? BigInt(v) : v) -
parseInt()返回 Number;需要 BigInt 时请用BigInt("123")
转换存在精度风险
BigInt 和 Number 之间转换不是无损的,尤其在边界附近极易出错。
-
BigInt(Number.MAX_SAFE_INTEGER + 1)→ 错误:因为Number.MAX_SAFE_INTEGER + 1在 Number 中已丢失精度,再转 BigInt 无法还原 -
Number(1000000000000000000000n)→ 可能返回Infinity或不精确值 - 安全做法:只对已知落在
[-2⁵³, 2⁵³]范围内的整数做双向转换 - 判断是否安全可借助:
num = Number.MIN_SAFE_INTEGER
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










