猿问

JavaScripts BigInt 的缺点是什么,我什么时候应该避免它?

有充分的理由不使用 BigInt 吗?

MDN 说

强迫

由于 Number 和 BigInt 之间的强制转换会导致精度损失,因此建议仅在合理预期大于 2^53 的值时才使用 BigInt,而不是在这两种类型之间进行强制转换。

据我了解,没有隐式类型强制,只有显式类型转换。这对我来说似乎不是一个很好的理由。

当我的数字“小”时,我不应该使用 BigInt 吗?我认为没有充分的理由避免它。


陪伴而非守候
浏览 226回答 2
2回答

森栏

据我了解,没有隐式类型强制,只有显式类型转换。确实。BigInt当我的数字“小”时,我不应该使用吗?我认为没有充分的理由避免它。我不是 s 的重度用户,BigInt但我同意您的评论:如果您依赖超出 的范围内的整数Number.MAX_SAFE_INTEGER,那么您绝对应该使用BigInts 来表示大整数和“小”整数。实际上我猜想 MDN 文档中的免责声明应该换一种方式来解释:如果你需要大整数,尽量不要使用类型转换,也就是说,首先不要使用Numbers。顺便说一句,这表明MDN 文档中的其他段落:但是,要小心来回强制值,因为BigInt当它被强制为 a 时,它的精度可能会丢失Number。

饮歌长啸

这些不一定是一项建议。它很容易成为两个相互关联的。仅BigInt用于合理可能超过 2^53 的整数。ABigInt不是通用数字。它专门用于大整数,因此得名。它们最好用在您期望大整数可能会出现的特定、孤立的情况下,这在很大程度上是因为在其他情况下,设计目标(包括防止意外的精度损失)使类型限制性太强而无法使用。你不能Math用它们做任何事情,你不能混合类型等等。对于你知道的小于 2^53 的数字,a 的Number限制要小得多(阅读:更有用),而且通常更快更容易一起工作。(有关性能差异的示例,请参阅https://jsperf.com/bigint-vs-number/5。最初的测试在 Chrome 中显示出 1% 的差异,但是一旦您的值不是有效恒定的,很难隐藏差异,并且性能急剧下降。)不要在BigInt和之间转换Number。的全部要点BigInt是用作任意精度整数。转换为 aNumber需要您要求的所有额外位,并将它们硬塞到双精度浮点数中。只有最重要的 52+1 位将被保留。如果您可以容忍这种情况发生,那么您可能一开始就不需要 a BigInt。它们是相互关联的,因为你处理的BigInts 越多,转换的诱惑就越大,因为 s 会更好,并且会遇到Number类型的限制。问题是,这些限制在很大程度上是故意的。BigInt你可以通过不使用而不是回避它们并扔掉一些东西来更好地避免这些限制。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答