JavaScript对象中的属性数量是否有限制?

时间:2012-02-14 19:20:31

标签: javascript object properties

我们有一个超过75000个属性的对象。对象的格式如下:

// The key starts with 3 letters and then is followed by 8 numbers
var bigArray = {'AAA########':123456789,
                'AAA########':123456790,
                'AAA########':123456791
               }; 

JavaScript对象的属性数量是否存在已知限制?从我的测试中,该对象仍可在65500个元素上运行。

  • 在Windows 7中,IE9脚本崩溃(错误-2147024882)。
  • Windows XP,IE8正常工作。

5 个答案:

答案 0 :(得分:7)

我不确定实际值是什么,但我在node.js中看到实际上限大约400,000(在16 GB的Mac上) RAM)。

这是我将数据库中的行添加到对象中的日志:

[[21:32:34.325]] [LOG] 340001, pint of delight
[[21:32:35.574]] [LOG] 350001, pound shrimp
[[21:32:36.545]] [LOG] 360001, ravioli allaragosta
[[21:32:37.721]] [LOG] 370001, roasted ham and cheese
[[21:32:39.862]] [LOG] 380001, salmon kama
[[21:32:41.152]] [LOG] 390001, scallops and vegetables
[[21:32:42.150]] [LOG] 400001, show cabernet ca
[[21:32:44.412]] [LOG] 410001, sloppy nachos
[[21:33:25.425]] [LOG] 420001, spaghetti or ziti sauce
[[21:35:37.839]] [LOG] 430001, steak au poivre vert
[[21:37:37.202]] [LOG] 440001, sushi moriawase
[[21:39:45.365]] [LOG] 450001, tequila shooters
[[21:42:09.036]] [LOG] 460001, toro roll with scallion
[[21:44:32.796]] [LOG] 470001, two enchiladas taco rice and refried beans
[[21:47:02.584]] [LOG] 480001, veuve clicquot ponsardin rose reims nv
[[21:49:04.020]] [LOG] 490001, whole turkey gourmet sides
[[21:51:15.264]] [LOG] finished

直到大约400,000,大约需要1秒才能插入10,000条新记录。过去410,000,时间几乎呈指数增长。

我不确定我将如何解决这个问题。也许制作2个对象并将它们限制为每个400,000个密钥...有点劳动密集但比重写字典对象更好:)

<强>更新 看起来实际上使用的内存量是问题,而不是对象的数量。我的机器在使用大约1.5 GB的RAM时慢慢爬行。它可能链接到分配给node.js进程的内存,可以使用以下参数增加: - max_old_space_size = 4096(数字以MB为单位)。

答案 1 :(得分:5)

  

由于Javascript内存的限制,数组的确切最大限制为2 ^ 32 - 1或4294967295。

Link

答案 2 :(得分:5)

从我们对这个问题的测试来看,似乎IE9,Windows 7,将HTA脚本中的行数限制为65535.我没有找到任何关于此问题的来源,这只是我们测试的结果。

答案 3 :(得分:4)

这将是2 ^ 32 - 1;但是,特定的浏览器可能会进一步限制它。

答案 4 :(得分:3)

在当前版本的Chrome(2017年9月)中,我限制在 830万个密钥附近。尝试在浏览器控制台中粘贴它:

let obj = {};
let keyCount = 0;
while(1) {
  obj[Math.random()] = Math.random();
  if(++keyCount % 10000 === 0) console.log(keyCount);
}

我在Node.js中得到了相同的限制:

node --max-old-space-size=20000 -e "let obj = {}; let keyCount = 0; while(1) { obj[Math.random()] = Math.random(); if(++keyCount % 10000 === 0) console.log(keyCount); }"

有趣的是,如果我使用Map,我可以在崩溃之前获得 1680万个键(您可以使用类似this的内容超过此限制。)< / p>