TypeError: 无法将 BigInt 转换为数字

当算术运算涉及 BigIntNumber 值的混合时,会出现 JavaScript 异常“无法将 BigInt 转换为数字”。

消息

TypeError: Cannot convert a BigInt value to a number (V8-based)
TypeError: Cannot mix BigInt and other types, use explicit conversions (V8-based)
TypeError: BigInts have no unsigned right shift, use >> instead (V8-based)
TypeError: can't convert BigInt to number (Firefox)
TypeError: Conversion from 'BigInt' to 'number' is not allowed. (Safari)
TypeError: Invalid mix of BigInt and other type in addition/multiplication/…. (Safari)
TypeError: BigInt does not support >>> operator (Safari)

错误类型

哪里出错了?

算术运算符的两侧必须都是 BigInt 或都不是。如果一个运算涉及 BigInt 和数字的混合,则结果应该是 BigInt 还是数字是不明确的,因为在这两种情况下都可能存在精度损失。

当通过 数字强制转换 过程将 BigInt 隐式转换为数字时,也会发生此错误。例如,如果将 BigInt 传递给期望数字的内置方法。

如果在两个 BigInt 之间使用 无符号右移运算符 (>>>),也可能发生此错误。在 Firefox 中,消息相同:“无法将 BigInt 转换为数字”。

示例

在运算中混合数字和 BigInt

js
const sum = 1n + 1;
// TypeError: can't convert BigInt to number

相反,请显式地将其中一侧强制转换为 BigInt 或数字。

js
const sum = 1n + BigInt(1);
const sum2 = Number(1n) + 1;

对 BigInt 使用无符号右移

js
const a = 4n >>> 2n;
// TypeError: can't convert BigInt to number

请改用普通右移。

js
const a = 4n >> 2n;

另请参阅