17370845950

JavaScript BigInt是什么_它如何表示大整数?
BigInt 是 JavaScript 中用于表示任意精度整数的原始类型,解决 Number 超过 2^53-1 后精度丢失问题;需用 n 后缀或 BigInt() 创建,不兼容 Number,不支持浮点数转换、Math 方法、JSON 直接序列化及混合运算。

BigInt 是什么?它不是 Number 类型的替代品

BigInt 是 JavaScript 中专门用于表示任意精度整数的原始类型,和 Number 互不兼容。它解决的是 Number 在超过 2^53 - 1(即 9007199254740991)后无法精确表示整数的问题。比如 9007199254740992 === 9007199254740993 返回 true,但用 BigInt 就能区分。

如何创建 BigInt?必须加 n 后缀或调用构造函数

不能通过字面量省略后缀,也不能从浮点数或 Number 自动转换。以下写法都合法:

const a = 123n;
const b = BigInt(123);
const c = BigInt("9007199254740991123456789");

但这些会报错:

  • BigInt(123.5)RangeError
  • 123.5n → 语法错误
  • let x = 123; x + 10nTypeError(禁止混合运算)

BigInt 支持哪些运算?不支持小数、位移和一元加号

支持 +-***%&&||、三元、比较(=== 等),但有明确限制:

  • 10n >> 1 合法,但 10n >>> 1(无符号右移)会报错(不支持)
  • +10nTypeError;必须写 Number(10n)10n.toString() 转换
  • Math.max(10n, 20n) 报错 —— Math 方法全都不接受 BigInt
  • 10n / 3n 是整除(结果为 3n),不保留小数

JSON 和 DOM 中不能直接使用 BigInt

JSON.stringify(100n) 会抛出 TypeErrordocument.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