Javascript会为未分配的数组索引创建空间吗?

时间:2014-10-14 15:36:52

标签: javascript arrays

我目前的代码与此类似:

var someArray = new Array();
someArray[0] = "stuff";
someArray[1] = "things";
someArray[10] = "more stuff";
someArray[20] = "other things";
someArray[100] = "far away stuff";

等等。

如果我这样做,是否会为索引1-9,11-19和21-99分配内存?数量是否足以让人担心此数组是否在10,000或其他高数字处添加了信息?

我知道你可以做类似

的事情
someArray["ABC"] = "foo";

然后将其视为名为someArray的对象上的属性,也可以像

一样使用
someArray.ABC = "foo";

那么这种情况会是一样吗?

2 个答案:

答案 0 :(得分:0)

编辑:显然这个答案对某些人来说有点过于简洁/模糊。

如前所述,您的示例中的内存分配行为未指定。也就是说,ECMAScript specification不会告诉引擎为未分配的数组插槽分配多少内存。(/ p>

真正的真正发生在幕后,然后,引擎变化很大。例如,一个给定的引擎可以选择为所有新数组预先分配100字节的内存,假设它们将被打包,然后如果指定的值与数组大小的某个比率为n,则随后取消选择进入稀疏数组实现。遇到了。这完全取决于引擎实现者的自由裁量权,因为语言规范再次在这里保持沉默。

话虽如此,阵列稀疏性对于语言本身来说是一个相当关键的概念(尽管其内存分配未指定)。例如,几个内置Array.prototype方法(例如.map().forEach())的规范明确定义了#34; hole"在数组中(即从未分配过的索引)。此外,现实世界的代码通常也会利用数组稀疏性。这些因素都给发动机实施者带来了很大的压力,使他们的发动机在遇到以下代码时不会摔倒并死机:

var arr = [];
arr[4294967295] = 'allocate this';

事实上,继续尝试吧。您会注意到任何值得注意的引擎(V8,Nitro,SpiderMonkey,Nashorn,Rhino,Chakra等)处理得很好。

现在,为什么它在每个引擎中的作用都是它自己的讨论,但简而言之,它是因为它们都期望,并且可以充分应对,稀疏阵列。

答案 1 :(得分:-2)

一般情况下,不应该浪费大量内存,因为当你有

var someArray = new Array();
someArray[0] = "stuff";
someArray[1] = "things";
someArray[10] = "more stuff";
someArray[20] = "other things";
someArray[100] = "far away stuff";

然后执行此操作:

alert(someArray[2]);

结果将为null / undefined。分配的内存不是未定义的,它将是一个空字符串。

我想在stackoverflow上对你的问题有一个非常详细的描述,但我没有时间阅读它。看看它,也许它可以帮助你。

Detailed Description