2012-03-14 128 views
3

那麼爲什麼myarray [bla] [bl]總是等於NaN?如果我用1維(myarray [bla])做同樣的事情,我會得到這個數字。數組返回NaN

var bla = 'blabla'; 
var bl = 'bla'; 
var myarray = []; 
for (i = 0; i < 10; i++) { 
    if (!myarray[bla]) { 
     myarray[bla] = []; 
    } 
    myarray[bla][bl] += i; 
    console.log(myarray[bla][bl] + " + " + i); 
}​ 
+0

因爲myarray [bla] [bl]沒有設置... – scibuff 2012-03-14 20:32:59

+0

'undefined + 0'是'NaN'。 – pimvdb 2012-03-14 20:33:28

回答

3

好吧,讓我們逐步完成循環,替換變量的實例與'blabla'字符串值:

if (!myarray['blabla']) { 
    myarray['blabla'] = []; 
} 

陣列以JavaScript是由整數值索引。你在這裏的代碼是將一個expando屬性添加到名爲blabla的數組實例。那就是:

myarray.blabla = []; 

現在重新考慮你的增量聲明:

myarray['blabla'][bl] += i; 

,或者與expando屬性:

myarray.blabla.bl // remember that "myarray.blabla" is set to the empty array above 

什麼,這是試圖做的是訪問名爲bl的財產空陣列。這就是爲什麼你在這裏得到undefined

無論如何,作爲一種最佳實踐,您可能希望避免在像JavaScript這樣的JavaScript中使用數組,因爲像這樣的問題必須在足夠的時間後出現。

+0

JavaScript中的哈希表的最佳實踐是JSON我猜?我來自perl背景,所有你需要知道的都是哈希。 – David 2012-03-14 20:45:09

+1

+1精彩和非常好的解釋 – fguillen 2012-03-14 20:47:01

+0

@David - 種 - 實際上JSON對象和JavaScript對象之間有區別,詳細在這裏比我所能做的更好:http://stackoverflow.com/questions/6489783/ - 但在一般來說,是的,你有時可以使用簡單的對象實例作爲哈希表。這個*不會工作的一個值得注意的例外是你的散列表鍵類型不是一個簡單的字符串,而是一個自定義對象類型。這個頁面有一些很好的解釋,爲什麼對象/數組的行爲方式如下:http://www.timdown.co.uk/jshashtable/ – matt 2012-03-14 21:14:50

0

如果擴大一點我希望你能看到的問題,

if (!myarray[bla]) { 
    myarray[bla] = []; 
} 
myarray[bla][bl] = myarray[bla][bl] + i; 

提示:myarray[bla][bl] = undefined

0

因爲myarray[bla][bl]未設置...,你需要

if (!myarray[bla][bl]){ myarray[bla][bl] = 0; }