JavaScript中的数组如何工作? (即没有起始尺寸大小)

前端之家收集整理的这篇文章主要介绍了JavaScript中的数组如何工作? (即没有起始尺寸大小)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
那天晚上我正在阅读关于阵列内部工作的 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).

原文链接:https://www.f2er.com/js/156934.html

猜你在找的JavaScript相关文章