【问题标题】:Why and how are JavaScript datastructures, like Arrays, not fixed length? [duplicate]JavaScript 数据结构(如数组)为什么以及如何不是固定长度的? [复制]
【发布时间】:2016-10-09 03:33:14
【问题描述】:

我对 CS 概念生疏了,我正在看 this review,大约 9:00 他们谈论数组是固定长度的。这是因为他们需要事先告诉堆栈要为结构分配多少内存,以便其他内存位置可以分配到其他地方。

我目前是一名 JavaScript 开发人员,但过去使用过 Java。为什么 JavaScript 数组可以动态分配([].push(element))?

我是从更深层次的角度来问这个问题——我知道 JS 中的数组是没有“长度”概念的对象,但是当您可以请求数组的长度并通过索引访问其值时,它会变得令人困惑像一个数组。

那么这是否意味着 JS 对象只与堆内存交互? JS中有固定长度结构的概念吗?

【问题讨论】:

  • c# List 一样的方式

标签: javascript arrays


【解决方案1】:

Javascript 数组的这方面可以通过添加一个间接级别来实现。

您可以将数组作为一个指针指向一个连续的内存区域,而不是让数组成为一个连续的内存区域。

使用这种方法,您仍然可以通过索引访问 O(1) 元素,但您可以通过将元素移动到另一个更大的连续区域来增加元素的数量。

这就是 C++ 对 std::vector 所做的事情。

通常,这些指向数组的数据结构也使用“填充指针”来实现。 IE。当您需要增加数组的大小时,您不会只分配所需的元素而是更多,留下额外的空间等待将来添加更多元素。

例如,C++ 中的std::vector 通常使用以下代码实现:

struct Vector {
    Element *first;
    Element *beyond_last;
    Element *end_of_storage;
};

beyond_lastend_of_storage 之间的空间是为您想要将push_back 放入向量中的下一个对象准备好的内存区域。这样你就不需要在每次添加时重新分配整个东西。

【讨论】:

    【解决方案2】:

    是的,JS中有定长数据结构:类型化数组。

    var arr = new Uint8Array(50);
    console.log(arr.length); // 50
    arr[99] = 123;
    console.log(arr.length); // still 50

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2011-12-07
      • 2010-11-26
      相关资源
      最近更新 更多