我目前的代码与此类似:
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";
那么这种情况会是一样吗?
答案 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上对你的问题有一个非常详细的描述,但我没有时间阅读它。看看它,也许它可以帮助你。