BigInt 解决了 JavaScript 中大整数精度丢失问题,能精确表示任意大小整数;它与 Number 类型不同、不可隐式转换,适用于加密、大 ID 等场景,但不支持 Math 方法、JSON 序列化及小数运算。
JavaScript 需要 BigInt 类型,是因为原生的 Number 类型基于 IEEE 754 双精度浮点数,**无法精确表示超过 253 − 1(即 9,007,199,254,740,991)的大整数**。一旦超出这个安全整数范围,Number 就会开始丢失精度——这不是 bug,而是浮点数表示法的固有局限。
它专为任意精度整数设计,能准确表示和运算极大整数(如加密密钥、高精度时间戳、大 ID、科学计算中的整数),且不会四舍五入或丢位。
9007199254740992 === 9007199254740993 在 Number 中返回 true(因精度丢失);而用 BigInt:9007199254740992n !== 9007199254740993n,结果正确为 true。类型不同、不可隐式转换、运算规则独立:
typeof 123 是 "number",typeof 123n 是 "bigint";二者是完全不同的原始类型。123n + 1 会报错 TypeError,必须显式写成 123n + 1n 或用 BigInt(1) 转换(但注意:BigInt 只接受整数字面量或字符串,不能传小数或 NaN)。BigInt 不支持 Math 方法(如 Math.pow)、不参与比较运算符的类型转换(10n > 5 允许,但 10n == 10 返回 false;严格相等 === 更安全)。BigInt 不能用于 JSON.stri
ngify()(会报错),需手动处理序列化(如转字符串:myBigId.toString())。它不是 Number 的“升级版”,而是补充型工具,用错场景反而引入麻烦:
BigInt 替代常规计数器、数组索引或循环变量——性能更低,且 DOM API、大多数浏览器 API(如 setTimeout、Date 构造函数)只接受 Number。/ 在 BigInt 中会**自动向下取整**(类似 Math.floor(a / b)),不返回小数部分;如需余数,用 %;如需商的小数形式,必须先转 Number(但可能再次丢失精度)。n 字面量(如 123456789012345678901234567890n),避免字符串解析开销;若必须用字符串,确保无空格、无小数点、无指数符号。本质上,BigInt 填补了 JavaScript 在整数精度上的关键空白,让语言能真正胜任需要数学严谨性的场景。它不替代 Number,而是与之分工明确:日常用 Number,精准大整数用 BigInt。