Math 所有方法均不接受 BigInt 参数,传入即抛 TypeError;隐式调用(如排序、解构默认值)同样触发错误;无类型检查预警,需用 **、手写比较等替代方案。
Math 对象所有方法都不接受 BigInt 类型参数,这是明确的规范行为,不是浏览器差异或临时限制。识别这类兼容性坑点,关键在于理解“类型隔离”和“隐式调用场景”两个维度。
任何 Math 方法(如 Math.pow、Math.floor、Math.sqrt、Math.max)只要接收到 BigInt 参数,运行时就会抛出 TypeError。这不是静默失败,而是明确中断。
Math.pow(2n, 3n) → 报错:"TypeError: Cannot convert a BigInt value to a number"
Math.floor(100n) → 同样报错,即使值在安全整数范围内Math.abs(-5n) 都不支持,尽管语义上完全合理有些操作看似没调 Math,实则底层依赖它,也会触发兼容性问题:
Math.sign(a - b),而 a、b 是 BigInt,减法结果仍是 BigInt,传给 Math.sign 就崩123n 和 Math,构建时或运行时可能暴露const { x = Math.round(y) } = obj,若 y 是 BigInt,Math.round 调用失败,整个解构中断JavaScript 是动态类型语言,typeof 或简单条件判断无法拦截这类错误:
typeof 123n === 'bigint' 可以识别类型,但不能阻止你把它传进 Math.log
Math.sqrt(value as bigint) 在 TS 编译期不报错,运行就挂Number.isSafeInteger() 的 BigInt.isSupportedByMath() 这种辅助 API遇到必须用大数做数学运算的场景,不能指望 Math 适配,得换思路:
** 操作符(2n ** 3n === 8n),它原生支持 BigInt(a / b) * b 等效于向下取整(需注意符号)a > b ? a : b 手写比较,别依赖 Math.max(...bigints)
Number.MAX_SAFE_INTEGER 内,再用 Number(bigint) 显式转,否则宁可保持字符串或自行实现整数算法