Javascript 为什么BigInt要求从数字显式转换? BigInt和数字转换

Javascript 为什么BigInt要求从数字显式转换? BigInt和数字转换,javascript,bigint,ecmascript-next,Javascript,Bigint,Ecmascript Next,在JavaScript中使用数字时,有两种基本类型可供选择-BigInt和Number。可以预期从较小类型到较大类型的隐式转换,这在JavaScript中是不存在的 预期 当计算BigInt和Number的某些组合时,用户可能期望从Number隐式转换为BigInt,如下例所示: const number = 16n + 32; // DOESN'T WORK // Expected: Evaluates to 48n 实际行为 同时在BigInt和Number上运行的表达式引发错误: con

在JavaScript中使用数字时,有两种基本类型可供选择-BigInt和Number。可以预期从较小类型到较大类型的隐式转换,这在JavaScript中是不存在的

预期 当计算BigInt和Number的某些组合时,用户可能期望从Number隐式转换为BigInt,如下例所示:

const number = 16n + 32; // DOESN'T WORK
// Expected: Evaluates to 48n
实际行为 同时在BigInt和Number上运行的表达式引发错误:

const number = 16n + 32; 
// Throws "TypeError: Cannot mix BigInt and other types, use explicit conversions"
为什么在上述情况下需要显式转换?
或者换句话说,这种设计背后的原因是什么?

它们并不是越来越小,越来越大。一个是实数,但可能不精确,另一个是整数,但精确。你认为16n+32.5的结果应该是什么?请注意,就类型而言,32和32.5之间没有区别。自动转换为BigInt将丢失任何分数值;自动转换为数字将面临精度损失和潜在溢出的风险。显式转换的要求迫使程序员选择他们想要的行为,而不让它成为潜在的非常可能的错误源。

这在最初的BigInt提案中有记录:

当出现一个混乱的情况时,这个建议会错误地抛出一个异常,而不是依赖类型强制,并冒着给出不精确答案的风险


这是一种设计选择。在静态类型语言中,强制可能会丢失信息,比如从float到int,小数部分被截断。JavaScript执行类型强制,您可能希望16n+32只使用32,就好像它是一个BigInt而不是一个数字一样,这样就不会有问题了。
这纯粹是一个设计选择,在这里你可能错过了一个要点: BigInt是关于整数的 数字是关于实数的
从32到32n的隐式转换可能有道理,但从浮点数(例如1.555到BigInt)的隐式转换可能会产生误导。

请告诉我:我仍然不喜欢他们含糊不清的动机。我希望看到一个实际的例子,假设它可能出错。一个动机可能是速度,。强迫是要付出代价的。如果V8或任何Javascript引擎可以强制执行typeof value='bigint',则不需要额外的检查。