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

Javascript会为未分配的数组索引创建空间吗?,javascript,arrays,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分配内存?如果此数组以10000或其他高数字添加了信息,那么这个

我目前有类似的代码:

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分配内存?如果此数组以10000或其他高数字添加了信息,那么这个数量是否足够重要

我知道你可以做类似的事情

someArray["ABC"] = "foo";
然后将其视为名为someArray的对象上的一个属性,也可以像

someArray.ABC = "foo";

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

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

如前所述,示例中的内存分配行为未指定。也就是说,引擎不会告诉引擎要(不)为未分配的阵列插槽分配多少内存

发动机罩下到底发生了什么,这取决于发动机的不同。例如,给定的引擎可能会选择为所有新数组预先分配100字节的内存,前提是这些数组将被打包,然后,如果不满足指定值与数组大小的特定比率,则随后会取消选择稀疏数组实现。不过,这完全取决于引擎实现者的判断,因为这里的语言规范同样是沉默的

这就是说,数组稀疏性对于语言本身来说是一个相当关键的概念(尽管内存分配尚未确定)。例如,一些内置的
Array.prototype
方法(例如
.map()
.forEach()
)的规范确实明确定义了数组中“洞”(即从未分配给的索引)的迭代行为。此外,现实世界的代码通常也利用数组稀疏性。这些因素都对引擎实现者施加了很大的压力,使他们在遇到以下代码时不会让引擎倒塌和死亡:

var arr = [];
arr[4294967295] = 'allocate this';
事实上,去试试吧。你会注意到任何值得注意的引擎(V8、Nitro、SpiderMonkey、Nashorn、Rhino、Chakra等)都能很好地处理


现在,它在这些引擎中工作的原因是它自己的讨论,但概括地说,这是因为它们都期望并且能够充分处理稀疏数组。

一般来说,不应该有很大的内存浪费,因为

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/未定义。分配的内存不是未定义的,它将是一个空字符串

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


你能提供一个官方规范的链接吗?@gamealchest还有什么需要特别说明的吗?这只是一个事实,规范没有告诉引擎如何实现稀疏阵列。事实上,几乎所有的现代引擎处理阵列稀疏性的效率也相当高。@gamealchest,一位极其挑剔的玩家。我对我所说的确切语义学持开放态度,并乐于修正,但答案在技术上是正确的。显然,我抛出的链接没有提到稀疏阵列的性能,因为我的全部观点是,规范没有提到任何关于稀疏阵列性能优化的内容。@GameAlchematic我扩展了我的答案。但老实说,它仍然可以归结为:1)规范没有说明在这种情况下应该做什么,2)值得注意的JavaScript引擎都以某种方式、形状或形式对此进行了优化。这最终是事实,直接解决了这个问题。争论“官方未定义”是否与“未指定”一样准确是愚蠢的,“一般”是惯用的准确,而“相当有效”显然与为每个可能的阵列插槽预分配有关<代码>/me耸耸肩,回到我的星期二…1)“你甚至没有提到这一切的关键方面”。这根本不是一个关键方面。问题是类型不可知的,是关于稀疏数组的,而不是关于统一类型的压缩数组的优化。2)“它可以被优化为一个普通的C++阵列”。这已经深入到了特定于实现的兔子洞,它只会强化我的观点。3) “这就是为什么不应该使用稀疏数组”。过于笼统的陈述;稀疏数组在正确的上下文中非常有用。4) “将被视为hashmap”。大概同样,非常特定于实现。这取决于引擎如何实现阵列!也许这对(V8)有帮助:事实上,如果你想知道到底发生了什么,你要么阅读引擎的源代码,要么(为了一些快速的结果)执行一些内存分析。我刚刚在Chrome中尝试了一个简单的分析,看起来像(至少在Chrome中)没有为未初始化的元素分配任何保留内存。
someArray[2]
将等于
undefined
,而不是空字符串。您只是缺少这里的要点。不存在的数组项不使用内存这一事实并不能证明这个问题。