2012-04-07 88 views
1

如果任何人知道如何存儲與JS數組,如果你有一個高值開始的數組處理我不知道。內存分配給數組

例如,如果你有:

array[5000] = 1; 

隨着陣列中的第一個值,5000之前一切根本不存在,將存儲器分配給陣列的量滿足未分配的4999個位置之前到它......或者它只會將內存分配給數組中的值[5000]?

我試圖削減想知道這個問題的:)

回答

2

當值分配給該5000個密鑰,而不是整個數組是用於我的腳本,這導致我的內存量人口:

var array = [];  // Create array 
array[5000] = 1; 
'1' in array;  // false: The key does not exists 
Object.keys(array); // 5000 (it's the only key) 

如果你想與陣列打擊你的新的瀏覽器,填充一個類型數組:

var array = new ArrayBuffer(6e9); // 6 Gigs 

兩者都可以很容易地在Chrome中得到驗證:打開控制檯和內存控制檯(Shift + Esc),並粘貼代碼。 window.a=new Array(6e9);window.a=[];window[6e9]=1;不會導致顯著增加內存,
window.a=new ArrayBuffer(6e9);崩潰的頁面。

PS。 6e9 === 6000000000

+2

這說明什麼? – 2012-04-07 15:52:07

+0

@Rob W所以你說它會爲所有5000分配內存? – Sir 2012-04-07 15:54:28

+0

@Dave只有第5000個密鑰的內存才被保留,其他密鑰不存在,並且沒有爲這些內存保留內存。 – 2012-04-07 15:57:37

0

JavaScript是真正的解釋和瀏覽器上運行,所以它依賴於瀏覽器是如何實現這種行爲。理論上,一旦你做了數組[5000],你就有一個5001個元素的數組,除了5001st是未定義的。

雖然如果我是執行運行此類腳本的邏輯的人,undefined將作爲默認值(如果未分配給其他任何其他值),這意味着我可能無法定義帶有1項將鍵5000分配給值1的映射。對數組中任何其他值的訪問都會自動返回undefined,而不必做不必要的工作。

下面是這個here的考驗。正如你所看到的,警報立即出現。

0

JS數組實際上是不是數組,你從如C,C++等,他們是其他編程語言知道他們喜歡訪問它們的方式,而不是數組對象。這意味着當你定義array[5000] = 1;時你實際上定義了數組對象的5000屬性。

如果您使用了一個字符串作爲數組鍵,您將能夠訪問索引作爲屬性以及演示此行爲,但由於變量名不能以數字array.5000開頭將是無效的。

array['key'] = 1; 
alert(array.key); // Gives you 1 

這意味着陣列很可能會實現很像對象,雖然每個實現可以自由地優化,從而給你,你的行爲,除了從那裏你可以定義object.aobject.z沒有確定整個字母對象。