2016-10-08 27 views
1

我在CS概念上很生疏,在看this review,大約9點他們談論的是陣列是固定長度的。這是因爲他們需要告訴堆棧預先分配多少內存以便其他內存位置可以分配到別處。爲什麼以及JavaScript數據結構如何像數組一樣,不是固定長度的?

我目前是一名JavaScript開發人員,但曾與Java合作過。爲什麼JavaScript數組可以動態分配([].push(element))?我知道在JS中的數組是沒有「長度」概念的對象,但它會變得混亂,當你可以請求一個數組的長度和訪問它的值索引像一個數組。

那麼這是否意味着JS對象只與堆內存交互? JS中有沒有定長結構的概念?

+0

C#列表中以同樣的方式 – amd

回答

3

Javascript數組的這方面可以通過添加一個間接級別來實現。

而不是讓陣列是連續的內存區域你可以做的是將數組作爲指針到連續的內存區域。

通過這種方法,你仍然可以通過索引O(1)元素訪問,但你可以通過移動元素的另一大的連續的區域增加元素的數量。

這是C++確實有std::vector例如。

通常這些指針到陣列的數據結構也與「填充指針」來實現。即當你需要增加數組的大小時,你不會將aread分配給需要的元素,而是更多,留下額外的空間等待將來添加更多的元素。

例如在C++中std::vector通常喜歡的東西來實現:

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

其中beyond_lastend_of_storage之間的空間是存儲區域準備好你要push_back下一個對象到載體。這樣你就不需要在每次添加時重新分配整個事物。

1

是的,JS:typed數組中有固定長度的數據結構。

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

相關問題