Javascript 数组的内存分配

Memory allocation of a Javascript array?

本文关键字:分配 内存 数组 Javascript      更新时间:2023-09-26

如果我向 Javascript 数组的第 1000 个元素添加一个值,那么假设这些位置是打开的,将该值添加到第 0 个元素有什么区别吗?

我说的是内存消耗。

例:

arr[1000] = 'asdf';

arr[0] = 'asdf';

由于 JavaScript 数组实际上是对象,内存不是连续的。因此,通过您的示例,访问array[1000]而不在其他地方存储任何内容将占用与您存储的任何内容相同的内存量(不是 1000 * 值大小)。

事实上,按照 Danny 的答案执行var arr = new Array(1000);操作不会创建一个包含 1000 个空插槽的数组。它创建一个具有值 1000length 属性的数组。

这样想:如果 JavaScript 不知道它存储的内容的类型和大小,它怎么知道要留出多少内存?

例如:

var arr = [];
arr[1000] = 'String value';

什么说我不能过来在另一个索引中存储整数?

arr[0] = 2;

源:https://stackoverflow.com/a/20323491/2506594

如果你有一个大小为 1000 的数组,则占用了 1000 个内存插槽。

var arr = new Array(1000);

数组查找的时间复杂度仍然是恒定的,因此这不会减慢应用程序的速度。

但是,您明确要求内存中有 1000 个插槽,因此它仍然是一个相当大的空间。虽然内存作为硬件很便宜,但您仍应尽可能保持数组大小的动态,以防止程序占用内存中不必要的空间。

JavaScript 对象本身并没有真正的排序。无论是数组还是对象,键的顺序都不重要;实现可以按所需的任何顺序放置它们。当然,您必须按某种顺序存储它们,因此大多数实现都按照您插入它们的顺序保存它们。但这只是一个巧合:规范没有强制要求它,所以你不能指望它总是正确的。

正因为如此, arr[1000]不一定是数组的第 1000 个元素:它只是一个具有恰好1000键的成员。如果您在其前面插入了 999 个元素,并且运行时将它们保持在广告顺序中,则它可能确实是第 1000 个元素。但它也可以很容易地成为第42个元素。它甚至可能是第一个元素,具体取决于运行时的实现和您自己的代码。

由于数组没有排序,假设还没有设置其他任何内存,分配给 arr[1000] 不会比分配给 arr[0] 占用更多的内存。如果你已经设置了 999 个元素,那么显然设置 arr[1000] 会导致数组占用比以前更多的空间,因为你必须将该元素存储在某个地方。但它不会仅仅因为它的密钥是 1000 而占用任何额外的空间。