BigInt 是 JavaScript 中用于表示任意精度整数的原始类型,解决 Number 超过 2^53-1 后精度丢失问题;需用 n 后缀或 BigInt() 创建,不兼容 Number,不支持浮点数转换、Math 方法、JSON 直接序列化及混合运算。
BigInt 是 JavaScript 中专门用于表示任意精度整数的原始类型,和 Number 互不兼容。它解决的是 Number 在超过 2^53 - 1(即 9007199254740991)后无法精确表示整数的问题。比如 9007199254740992 === 9007199254740993 返回 true,但用 BigInt 就能区分。
不能通过字面量省略后缀,也不能从浮点数或 Number 自动转换。以下写法都合法:
const a = 123n;
const b = BigInt(123);
const c = BigInt("9007199254740991123456789");但这些会报错:
BigInt(123.5) → RangeError
123.5n → 语法错误let x = 123; x + 10n → TypeError(禁止混合运算)支持 +、-、*、**、%、&&、||、三元、比较(===、 等),但有明确限制:
10n >> 1 合法,但 10n >>> 1(无符号右移)会报错(不支持)+10n 报 TypeError;必须写 Number(10n) 或 10n.toString() 转换Math.max(10n, 20n) 报错 —— Math 方法全都不接受 BigInt
10n / 3n 是整除(结果为 3n),不保留小数JSON.stringify(100n) 会抛出 TypeError;document.getElementById("x").dataset.value = 100n 也会失败(DOM 属性只接受字符串)。必须显式转换:
JSON.stringify({ big: 100n }, (k, v) => typeof v === 'bigint' ? v.toString() : v);
// →
'{"big":"100"}'同理,从 JSON 解析回来后需手动转回:BigInt(data.big),且要确保原始字符串只含整数字符。
跨浏览器支持已较稳定(Chrome 67+、Firefox 68+、Safari 14+),但服务端 Node.js 需 ≥ v10.4.0,且注意 V8 引擎在序列化时仍不默认支持 BigInt。