为什么以及如何将JavaScript数据结构(如数组)固定长度?

时间:2016-10-08 19:22:38

标签: javascript arrays

我在CS概念上生气,正在观看this review,并且在9点左右,他们谈论阵列是固定长度的。这是因为他们需要告诉堆栈预先分配给结构的内存量,以便可以在其他地方分配其他内存位置。

我目前是一名JavaScript开发人员,但过去曾使用过Java。为什么可以动态分配JavaScript数组(from e in _context.Entries where e.MeetId == meetId && e.LocationId == locationId let firstNumber = e.EntryEvents .Select(q => q.EventNumbers.Event_Number) .OrderBy(n => n) .FirstOrDefault() orderby firstNumber select new { firstNumber, e.Name } // Or some other property to identify Entry )?

我从更深层次的角度提出这个问题 - 我理解JS中的数组是没有"长度"的概念的对象,但是当你可以请求长度时它会变得混乱数组并通过索引访问其值,如Array。

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

2 个答案:

答案 0 :(得分:3)

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

不要让数组成为连续的内存区域,而是将数组作为指针连接到连续的内存区域。

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

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

通常,这些指针到数组的数据结构也使用"填充指针"来实现。即当你需要增加阵列的大小时,你不需要分配所需的元素,但是更多,留下额外的空间等待将来添加更多的元素。

例如,C ++中的std::vector通常用以下内容实现:

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

beyond_lastend_of_storage之间的空格是准备好下一个对象的内存区域,您希望push_back进入向量。通过这种方式,您不需要在每次添加时重新分配整个事物。

答案 1 :(得分:1)

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



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