2012-02-22 40 views
3

在PHP中,如果你這樣做如何防止在Javascript中創建額外的數組元素?

$var = array(); 
$var[5000] = 1; 
echo count($var); 

它打印1.

在JS這讓 「丟失」 的元素。

<script type="text/javascript"> 
    var fred = []; 
    fred[10] = 1; 
    alert(fred.length); 
</script> 

警報「11」。

我可以預防嗎?對任何事物都有好處嗎?我是一個試圖適應Javascript的PHP編碼器。

編輯:

我正在使用谷歌地圖V2和markerManager的應用程序。代碼已經運行了很長時間,但Chrome(17.0.963.56米)突然出現一個問題,即標記似乎被複制(或更多),然後渲染移動的標記完全錯誤,通常會導致瀏覽器凍結。使用Firebug查看DOM,我在markerManager中的grid_變量下發現了數組中「未定義」元素的碎片。我認爲,如果我可以刪除這些,我可能會有更多的代碼,無論它是否修復了標記問題。謝謝。

回答

1

作爲一個PHP編碼器,您習慣於相當隨意的數組鍵。然而,在JavaScript中,如果您以數字方式指定一個不存在的數組元素,則該數組將被分配空元素,直到您創建的元素爲止。這是你找到的行爲。另一方面,對象{}而不是[]表示接受任意屬性名稱(謹慎),並且更接近於您習慣於PHP的數組結構功能。這並不是說,JavaScript對象(或對象文字)是直接模擬到PHP數組....

如果你想要的是一個名爲「10」的關鍵數據結構,這是一個工作。對象常量(雖然它不是偉大實踐中,以數字命名的對象屬性

var fred = {}; 
fred["10"] = 1; 

注意,處理對象文本的比較正常的語法是object.property符號,但這不是有效的數值屬性:

// name as a property 
fred.name = "fred"; 

// Syntax error... 
fred.10 = 10; 

// Use [] notation for numeric properties: 
fred["10"] = 10; 

對象文本做但是,沒有length屬性。所以你不能這樣做:

fred.length; 
// undefined 
0

您可以使用一個對象而不是一個數組,但你失去一些數組的好處,就像訪問length財產。

<script type="text/javascript"> 
    var fred = {}; 
    fred['10'] = 1; 
    // alert(fred.length); // won't work anymore 
</script> 

另一方面,不會生成額外的條目,並且訪問特定值的方式與數組中的方式幾乎相同。如果要遍歷所有值,請使用以下代碼:

for(var el in fred) { 
    if (fred.hasOwnProperty(el)) { 
    alert(fred[ el ]); 
    } 
} 
+0

感謝(非常快)的答案。它們非常有意義。所以這是一個補充問題....是否有人在Google映射中熟悉MarkerManager?它似乎以我展示的方式製作陣列,導致巨大的內存使用量。或者,也許我錯了? – Pete 2012-02-22 17:13:02

+0

添加您的問題作爲主要問題的編輯或(甚至更好)爲此打開一個新的問題。至少我不知道備用陣列的內存使用情況。 – Sirko 2012-02-22 17:22:01

+1

@Pete數組可能有這樣的長度,但通常在瀏覽器中不使用數組數據結構(與數組數據類型相反)來存儲稀疏數組(即,其中有洞的數組 - 您的代碼不會實際上創建一個名爲'0','1','2','3',...,'9'的屬性,所以內存使用不是O(n),其中n是長度。通常情況下,內存使用量爲O(n),其中n是類似數組屬性的數量(小於或等於該長度)。 – gsnedders 2012-02-22 17:22:07

相關問題