【问题标题】:Memory allocation of a Javascript array?Javascript数组的内存分配?
【发布时间】:2017-12-04 22:25:55
【问题描述】:

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

我说的是内存消耗。

例子:

arr[1000] = 'asdf';

arr[0] = 'asdf';

【问题讨论】:

  • 取决于引擎如何处理稀疏数组(以及最大大小的孔)。
  • “字典”是什么意思?你有一个对象(var arr={};)还是一个数组(var arr=[];)?
  • 我的意思是 (var arr=[];)。抱歉,我的术语可能不是最好的。

标签: javascript memory


【解决方案1】:

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

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

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

例如:

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

说明我不能在另一个索引中存储一个整数?

arr[0] = 2;

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

【讨论】:

    【解决方案2】:

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

    var arr = new Array(1000);

    时间复杂度仍然是constant for array lookups,所以这不会拖慢您的应用程序。

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

    【讨论】:

    • 感谢您今天对我的帮助很大。等待 10 分钟后,我会接受答案。
    • 什么是“插槽”?如果您是这个意思,则不会创建任何属性。
    • 还有一个问题:如果第 0-999 个元素为空,那么我是否占用了大量内存(千字节、兆字节等),或者它们只是为该数组预留。
    • stackoverflow.com/questions/20321047/… JavaScript 中的数组实际上是对象,因此它们不是连续的内存(取决于实现)。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 1970-01-01
      • 2011-12-15
      • 2023-03-15
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多