如果您在Chrome的控制台中尝试9n**9n**9n,Chrome会中断(类似于无限循环)。

  • 在这种情况下,V8引擎是否缺少实现?

  • 我的意思是,如果您尝试9**9**9,它将返回Infinity,这很好。
  • 在前一种情况下,V8为什么也不会返回Infinity
  • 为什么它似乎陷入无限循环?

  • 我也在Firefox中进行了尝试,并且这个问题不存在,因为当前SpiderMonkey中没有BigInt实现。

    谢谢!

    最佳答案

    如前所述,9n9的BigInt表示形式。
    **(幂)运算符从右到左工作,导致结果快速提升:

    2n**2n**2n === 2n ** 4n === 16n
    3n**3n**3n === 3n ** 27n === 7625597484987n
    4n**4n**4n === 4n ** 256n === 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096n
    

    在我的系统上,这从7n**7n**7n变得很费时,这需要大约32秒来计算打印。结果是695976位,其中前5000位打印在控制台中。

    我没有再尝试过,但是我想说它只是在考虑结果。这可能需要数小时或数天才能计算出打印量(或者有时可能会出现“内存不足”情况)。

    更新:

    我刚刚在Chrome控制台中尝试了var x = 7n**7n**7n,因此只需将其分配给一个变量即可完成此操作。事实证明,将bigint转换为字符串是很费时间的。打印 x.toString().length 与打印x7n**7n**7n花费的时间相似。

    进一步的实验揭示了其他有趣的行为,请参见以下结果:
    // Pure calculation time increases significantly when the exponent grows:
    var x = 7n**7n**7n; // ~   1200 ms
    var x = 7n**8n**7n; // ~   7000 ms
    var x = 7n**7n**8n; // ~  62000 ms
    var x = 7n**8n**8n; // ~ 470000 ms
    
    // But it's a different story when the base number is 'simple' in binary terms, e.g. 8n:
    var x = 8n**7n**7n; // ~      1 ms
    var x = 8n**8n**7n; // ~      1 ms
    var x = 8n**7n**8n; // ~      7 ms
    var x = 8n**8n**8n; // ~     17 ms
    

    是的,这一切都结束了:
    var x = 32n**16n**8n;
    

    给出:



    Chrome的上限似乎是 10亿位(1e9位),或大约125 MB-引用:https://github.com/tc39/proposal-bigint/issues/174#issuecomment-437471065

    07-24 22:01