为什么将 n 附加到数字以创建 BigInt会导致错误?

问题描述

我正在编写一个程序来返回具有给定长度数字的斐波那契数列中第一个数字的索引。

将 n 附加到函数调用中的数字会产生以下结果:

let fibIdxByLength = (length) => {
  let [ cur,next ] = [ 1n,1n ];
  let idx = 2n;
  while (next < (10 ** (length - 1))) {
    [ cur,next ] = [ next,cur + next ];
    idx++;
  }
  return idx;
};

fibIdxByLength(2n) === 7n; // 1 1 2 3 5 8 13
fibIdxByLength(3n)  === 12n;  // 1 1 2 3 5 8 13 21 34 55 89 144
fibIdxByLength(10n) === 45n;
fibIdxByLength(16n) === 74n;
fibIdxByLength(100n) === 476n;
fibIdxByLength(10000n) === 4782n;

这导致:标识符直接在数字之后,程序将无法运行

我也尝试过使用 BigInt(),但它说 BigInt 未定义。

有什么想法吗?

解决方法

我不知道为什么 BigInt() 不起作用(当我在 Chrome 控制台中运行和调试它时,它至少对我有用,它告诉我它不喜欢你这样做时(长度 - 1).这是因为length是一个BigInt类型,而1是一个普通的整数类型。10也发生了同样的情况。我把它们都做成了BigInt类型,它似乎可以工作。

let fibIdxByLength = (length) => {
  let [ cur,next ] = [ 1n,1n ];
  let idx = 2n;
  while (next < (10n ** (length - 1n))) {
    [ cur,next ] = [ next,cur + next ];
    idx++;
  }
  return idx;
};

fibIdxByLength(2n) === 7n; // 1 1 2 3 5 8 13
fibIdxByLength(3n)  === 12n;  // 1 1 2 3 5 8 13 21 34 55 89 144
fibIdxByLength(10n) === 45n;
fibIdxByLength(16n) === 74n;
fibIdxByLength(100n) === 476n;
fibIdxByLength(10000n) === 4782n;

,

如果 BigInt 未定义,则说明您的浏览器太旧。检查 caniuse.com/bigint 以获取支持 BigInts 的浏览器(简称:Chrome 和 Opera 自 2018 年以来,Firefox 自 2019 年以来,Safari 和 Edge 自 2020 年以来)。