bigint 解决大整数精度问题但兼容性有限:ie 全系及旧版主流浏览器和 node.js v10.4.0 前不支持,需运行时检测(如 try/catch 中 typeof 1n)并配合 core-js 或 jsbi 等 polyfill,且须避免与 number 混用。

BigInt 在 JavaScript 中解决大整数精度问题很有效,但它的浏览器支持并不全面,尤其在旧环境里必须配合 Polyfill 才能安全落地。
哪些环境不支持 BigInt
IE 全系完全不支持;Safari 12 以下、Chrome 67 以下、Firefox 68 以下也都缺失原生支持。Node.js 方面,v10.4.0 之前版本同样无法使用。如果项目需覆盖这些环境,不能直接写 123n 或调用 BigInt(),否则会报语法错误或运行时异常。
检测与降级策略
不要靠 UA 字符串判断,应做运行时特性检测:
- 检查
window.BigInt是否存在且为函数 - 尝试执行简单表达式如
typeof 1n === 'bigint'(注意:此语法本身在不支持环境中会直接报错,所以检测需放在try/catch或动态eval中) - 更稳妥的做法是结合构建工具,在打包时根据目标环境自动排除或注入 polyfill
可用的 Polyfill 方案
目前没有完全无损模拟 BigInt 行为的 Polyfill(因涉及底层运算和字面量语法),但有几种实用路径:
-
core-js:提供
BigInt构造函数的兼容实现,支持从字符串、数字创建,也支持基本运算(+、-、*、**等),但不支持n字面量语法,需统一用BigInt("...") - jsbi(已归档但仍广泛使用):轻量、纯 JS 实现,API 与原生 BigInt 高度一致,适合 Node.js 环境或需精细控制的场景
-
业务层降级:对非计算密集型场景(如 ID 传输、配置解析),可全程用字符串代替,仅在支持环境才转为
BigInt进行运算
混合类型运算的注意事项
原生 BigInt 不允许与 Number 混用,Polyfill 通常也不模拟这种限制——但这恰恰是隐患来源:
- 用 core-js 时,
BigInt(1) + 2可能“意外”成功,但结果类型不一致,后续逻辑易出错 - 建议统一约定:所有大数操作前先显式转换,如
BigInt(a) + BigInt(b)或Number(big) + num - 避免依赖一元加号
+big,它在原生环境就抛错,Polyfill 一般也不支持
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











