如果任何人知道如何存儲與JS數組,如果你有一個高值開始的數組處理我不知道。內存分配給數組
例如,如果你有:
array[5000] = 1;
隨着陣列中的第一個值,5000之前一切根本不存在,將存儲器分配給陣列的量滿足未分配的4999個位置之前到它......或者它只會將內存分配給數組中的值[5000]?
我試圖削減想知道這個問題的:)
如果任何人知道如何存儲與JS數組,如果你有一個高值開始的數組處理我不知道。內存分配給數組
例如,如果你有:
array[5000] = 1;
隨着陣列中的第一個值,5000之前一切根本不存在,將存儲器分配給陣列的量滿足未分配的4999個位置之前到它......或者它只會將內存分配給數組中的值[5000]?
我試圖削減想知道這個問題的:)
當值分配給該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
JavaScript是真正的解釋和瀏覽器上運行,所以它依賴於瀏覽器是如何實現這種行爲。理論上,一旦你做了數組[5000],你就有一個5001個元素的數組,除了5001st是未定義的。
雖然如果我是執行運行此類腳本的邏輯的人,undefined
將作爲默認值(如果未分配給其他任何其他值),這意味着我可能無法定義帶有1項將鍵5000分配給值1的映射。對數組中任何其他值的訪問都會自動返回undefined,而不必做不必要的工作。
下面是這個here的考驗。正如你所看到的,警報立即出現。
JS數組實際上是不是數組,你從如C,C++等,他們是其他編程語言知道他們喜歡訪問它們的方式,而不是數組對象。這意味着當你定義array[5000] = 1;
時你實際上定義了數組對象的5000屬性。
如果您使用了一個字符串作爲數組鍵,您將能夠訪問索引作爲屬性以及演示此行爲,但由於變量名不能以數字array.5000
開頭將是無效的。
array['key'] = 1;
alert(array.key); // Gives you 1
這意味着陣列很可能會實現很像對象,雖然每個實現可以自由地優化,從而給你,你的行爲,除了從那裏你可以定義object.a
和object.z
沒有確定整個字母對象。
這說明什麼? – 2012-04-07 15:52:07
@Rob W所以你說它會爲所有5000分配內存? – Sir 2012-04-07 15:54:28
@Dave只有第5000個密鑰的內存才被保留,其他密鑰不存在,並且沒有爲這些內存保留內存。 – 2012-04-07 15:57:37