2009-09-22 47 views
6

無論何時在頁面上單擊相應的按鈕,我都會使用數據庫中的項目標識創建JavaScript數組。每個數組條目都會存儲一個自定義對象。在這種情況下,數組大小問題在javascript中?

特定數據庫的ID可以從80123到80223之間的任何數字開始,針對特定頁面的數據。

所以數組中的第一個入口就像arr [80123]。

現在,當我檢查數組的長度時,它顯示了我80123!即使只有1個元素,我想使用關聯或字符索引數組,但是他們缺少一些我需要的基本排序操作。

現在我的問題是「如果數組中只有1個元素,但數組的長度是80123,數組實際上將消耗多少內存?」

更多信息...

基數不斷變化80123只是一個例子。代碼即時通訊使用

如下:

function ToggleAction(actionButtonID, action) 
    { 
     var extractedID = ExtractNumericIdFromTag(actionButtonID); 
     var arrayIndexer = extractedID; // Can update this to make array associative 

     if(actionItems[arrayIndexer] == null) 
     { 
      actionItems[arrayIndexer] 
       = new ActionItem(extractedID, action); 
     } 
     else 
     { 
      var ai = actionItems[arrayIndexer]; 
      ai.action = action; 
     } 
    } 
+4

當然,大小無關緊要!至少這是她告訴我的。 – JonnyD

+3

爲什麼不只是減去基數80123而是從0到999? – Gumbo

+0

另請參閱:http://stackoverflow.com/questions/1247116/which-takes-less-memory-a-javascript-array-or-javascript-object –

回答

3

陣列在Javascript只是有一些特殊的屬性散列(主要是「長度」屬性將始終返回比最高的整數鍵一個更高)。

我不相信任何這些實現​​都會因爲最初爲某個非常高的索引分配了某些東西而分配大量的內存。

+2

這是真的,因爲數組[]是您可以添加屬性的對象{},但它不會*表示數組中的整數索引項是對象散列的一部分。他們是陣列的一部分。 – Maciek

+0

這是真的,但區別與它是一個數組對象沒有多大關係。積分索引屬性也可以添加到非數組對象,並以相同的方式索引:「javascript:function a(){var b = {}; b [1] = 5; alert(b [1]); } 一個();」。由於這些密鑰的規則的特殊性,它僅在「對象散列」中不存在。 – jsight

0

你如何定義你的數組?如果使用Array對象,則必須有多個參數供瀏覽器將參數解釋爲值,而不是數組的長度。我總是儘量使用文字數組的語法:a = [80123];a = [80123,80124];

1

嘗試在Firebug運行下面的代碼:

var a = []; 
a[663] = "a"; 
a.length == 664; 

這將返回

true 

如果再嘗試

console.log(a) 

您將得到:

[undefined, undefined, undefined, ...... , undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "a"] 

多少內存消耗了可能是你使用的發動機的問題,但它看起來有很多時隙分配給持有任何價值。

我覺得你真的想用什麼只是一個簡單的對象風格的地圖是這樣的:

var a = {}; 
a[664] = "a"; 
a[323] = "b"; 
a 

這將產生:

Object 664=a 323=b 

這是ID的關聯映射更合適 - >對象。

如果需要通過這個對象來迭代以後訪問所有對象,使用下面的代碼:

for(var id in a){ 
    if(a.hasOwnProperty(id)){ 
    console.log("id:",id," object:",a[id]); 
    } 
} 
+2

僅僅因爲Firebug顯示所有這些未定義的元素並不意味着它正在分配所有這些數組元素。 AFAIK Firebug只是做一個for循環到Array.length屬性並吐出Array [idx] ||未定義。 Array(內存明智)的長度與Array.length不是一對一的比較。在100000索引處定義的一個元素的數組在內存上並不比擁有一個元素和100000的鍵的對象大很多。 –

+2

我很確定toString的「未定義」輸出表示它沒有實際分配什麼都有。數組對象可能只有一個自定義的toString,它在數組長度上做了一個簡單的循環,並且任何時候它爲不存在的事物執行[i]時都會得到'undefined'。 – Herms

0

我不知道怎麼陣列JS的行爲,但我認爲你是安全的在這裏。

如果你不是,我認爲你可以考慮改變基於id的最小值(在你的例子中爲80123)的數組索引,以便數組索引從零開始。

index = id - minID; 

這可能需要更改(很多)其他地方的代碼,所以只有在絕對必要時纔去做。

+1

請擴展快捷鍵(r,u)。這不是真的需要這裏。 – Ikke

+0

完成..但我認爲你和r被廣泛接受,理解和可讀。 – Amarghosh

+0

@Amarghosh:我想我們都有足夠的時間來寫適當的英語(或者至少嘗試)。 – Gumbo

0

這個問題之前已經暗示周圍:

Which takes less memory: a Javascript array or Javascript object?

從理論上講,在Javascript中,數組IS對象。 。數組中唯一改變(在內存中)的是.length屬性。它將顯示下一個最高的數組索引,但這並不意味着實際上已分配數組中的許多元素。

6

你的代碼沒有分配那麼多的內存,所以你不必擔心這一點。 JavaScript數組足夠聰明。不過,我仍然認爲你應該在這種情況下使用Object而不是Array ...

var num = 80123; 
var obj = {}; 
obj[num] = { Name: "Josh" }; 

alert(obj[80123].Name); 
+1

這是一個很好的答案。是的,Javascript數組足夠聰明,不會浪費內存,但不是,你不應該使用這樣的數組。完美的答案。優秀。 –

+0

感謝您的文法更正,貝斯卡!最近我一直在做很多事情:( –