我如何知道在 JavaScript 中构造 Set 的大小限制是多少?

Fer*_*aye 4 javascript three.js

我正在制作一个用于从浏览器中的模型中删除几何图形的工具。

在删除过程的某个步骤中,我获取一个充满索引的数组,并从中创建一个 Set 以获取不重复索引的数组。

function GetSetFromArray(array){
    return new Set(array);
}
Run Code Online (Sandbox Code Playgroud)

这个功能一开始在很多型号上都运行良好。由于我想尽快处理删除,因此我想避免使用需要 .indexOf 的解决方案。

但是当我尝试从一个大模型中删除时,例如,一个长度约为 15,000,000 的数组。我在浏览器控制台上收到以下错误:

未捕获(承诺) RangeError:超出设置的最大大小

控制台错误截图

我想知道创建Set的最大尺寸是多少?这是否取决于浏览器?或者在运行浏览器的PC上?有办法得到这个号码吗?我想也许如果我可以获得集合的大小限制,我就可以将数组拆分为一系列集合然后使用它?

Cer*_*nce 5

包含 Set 中项目的集合在规范中称为“List”,并且未指定List 的大小限制。

这些序列可以是任意长度

集合列表的大小也没有特别指定。( 1 , 2 )

  1. 将 set.[[SetData]] 设置为新的空列表。

因此,它必须是实现定义的。

这是否取决于浏览器?或者在运行浏览器的PC上?

它将取决于浏览器使用的 JavaScript 引擎(例如,V8、SpiderMonkey、JavaScriptCore 等)。

有办法得到这个号码吗?

只是.add将项目放入集合中,直到抛出为止。

const getSetSizeLimit = () => {
  let i = 0;
  const set = new Set();
  while (true) {
    try {
      set.add(i);
    } catch(e) {
      return i;
    }
    i++;
  }
  return i;
};
console.log(getSetSizeLimit());
Run Code Online (Sandbox Code Playgroud)

在我的 Windows-Chrome 上,限制看起来是 16777216,即2 ** 24.