微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐