BigInt 是唯一能安全表示任意精度整数的原生类型,因 Number 基于 IEEE 754 双精度浮点数,安全范围仅限 ±(2^53−1),超限会导致精度丢失;BigInt 必须用 n 后缀或 BigInt() 创建,不与 Number 混合运算,支持常用算术操作但除法向零取整,JSON 序列化需手动转换,性能较低且不适用于 DOM、定时器等场景。
JavaScript 的 BigInt 是唯一能安全表示任意精度整数的原生类型,不是“大数库的替代方案”,而是语言层面对整数溢出问题的根本补救。
Number 基于 IEEE 754 双精度浮点数,安全整数范围仅限 -(2^53 - 1) 到 2^53 - 1(即 Number.MAX_SAFE_INTEGER)。超出后会出现精度丢失:
console.log(9007199254740991 + 1 === 9007199254740992); // true console.log(9007199254740991 + 2 === 9007199254740992); // true ← 错误!
这种隐式舍入无法用于 ID、时间戳、密码学运算或金融计算。
必须用字面量后缀 n 或构造函数 BigInt() 创建;不能与 Number 混合运算,否则抛出 TypeError。
123n、0n、-456n 是合法字面量;123.45n 或 1e5n 语法错误BigInt("9007199254740991") 可接受字符串(含负号),但 BigInt(123.45) 会报错:只能转换整数值+、-、*、**、%)都支持 BigInt,但 / 会向零取整(不返回小数)=== 和 == 在 BigInt 与 Number 间始终为 false,哪怕数值相等JSON.stringify() 直接忽略 BigInt 并抛出 TypeError;ArrayBuffer 视图(如 BigInt64Array)需显式指定大小端,且不兼容 Number 视图混用。
JSON.stringify(obj, (k, v) => typeof v === 'bigint' ? v.toString() : v)
BigInt64Array 存储的是有符号 64 位整数,超出范围会静默截断,不是任意精度BigInt 不可被 for...in 枚举,也不参与 Object.keys(),但它确实是 object 类型(typeof 123n === 'bigint' 是 ES2025 后才统一的)它不是万能解药。高频数学运算(如图形渲染、物理模拟)中,BigInt 的性能比 Number 低一个数量级;DOM 属性(如 element.style.left)、定时器参数(setTimeout)、Date 构造函数都
不接受 BigInt。
requestAnimationFrame 回调接收的时间戳是 DOMHighResTimeStamp(number),不能直接传 BigInt
fs.stat() 返回的 mtimeNs 是 BigInt,但 process.hrtime.bigint() 才返回 BigInt,旧 API(如 process.hrtime())仍返回数组真正需要任意精度时,BigInt 是唯一正解;但多数场景下,确认数值是否真在安全整数范围内,比盲目上 BigInt 更关键。