那天晚上我正在阅读关于阵列内部工作的
this post,并从发布的答案中学到了很多,尤其是从
Jonathan Holland的答案.
因此,事先给出数组大小的原因是需要预先保留空间,以便数组中的元素将在内存中彼此相邻放置,从而提供O(1)访问时间,因为指针偏移遍历.
但是在JavaScript中,你可以像这样初始化一个数组:
var anArray = []; //Initialize an empty array,without a dimension
所以我的问题是,因为在JavaScript中你可以初始化一个数组而不预先指定一个维度,为数组分配的内存如何仍然提供O(1)访问时间,因为事先没有指定内存位置的“数量”?
解决方法
嗯.您应该区分数组和关联数组.
数组:
A=[0,1,4,9,16];
关联数组:
B={a:'ha',b:27,c:30};
前者有长度,后者没有长度.当我在javascript shell中运行它时,我得到:
js>A=[0,16]; 0,16 js>A instanceof Array true js>A.length 5 js>B={a:'ha',c:30}; [object Object] js>B instanceof Array false js>B.length js>
数组如何在Javascript中“工作”是依赖于实现的. (Firefox和Microsoft以及Opera和谷歌Chrome都会使用不同的方法)我的猜测是它们(数组,而不是关联数组)使用类似STL的std::vector.你的问题:
how is memory allocated for an array
to still provide a O(1) access time
since the ‘amount’ of memory locations
is not specified beforehand ?
更像是std :: vector(或类似的可调整大小数组)的工作方式.它根据需要重新分配给更大的数组.最后的插入需要分摊O(1)时间,即如果插入N个元素,其中N大,则总时间为N * O(1).那些必须调整阵列大小的单个插入可能需要更长的时间,但平均而言需要O(1).