2011-11-23 61 views
40

考慮這個例子的Javascript代碼:Javascript數組宣言:新的Array(),新陣列(3),[ 'A', 'B', 'C']創建不同行爲的陣列

a = new Array(); 
a['a1']='foo'; 
a['a2']='bar'; 

b = new Array(2); 
b['b1']='foo'; 
b['b2']='bar'; 

c=['c1','c2','c3']; 

console.log(a); 
console.log(b); 
console.log(c); 

結果在Firebug控制檯如下:

對於(在 '[]' 不得不通過點擊 '+' 按鈕被擴展):

[]  
a1 "foo" 
a2 "bar" 

對於b:

[undefined, undefined] 

對於C:

["c1", "c2", "c3"] 

我的問題是:

  1. 現在用的陣列I [ '鍵'] = '值' 語法正確?
  2. 爲什麼數組b不按預期工作?
  3. 爲什麼控制檯中的數組a和c顯示不同?似乎jQuery無法通過.each()方法遍歷數組a。
  4. 你可以推薦任何有關Javascript數組行爲的優秀教程嗎?

注:谷歌Chrome瀏覽器的Firebug的僅顯示陣列[] '一',而選擇將其展開。

編輯:好吧,似乎Javascript中的數組只有數字鍵,所以添加一個字符串作爲鍵名稱使對象不在數組中。但爲什麼不jQuery的。每個工作呢?

$.each(a, function() 
    { 
    alert ('derp'); 
    }) 

該腳本追加到腳本中,不產生警報。

+1

您將JavaScript的數組對象與像PHP這樣的語言提供的關聯數組混淆了。 JavaScript數組僅使用數字索引。使用語法'a ['a1'] = val'將屬性'a1'添加到對象'a',而不是數組值。 –

+0

@ P.Brian.Mackey:可能是因爲這類問題在SO上被問過很多次。 – RightSaidFred

+1

@exizt:Firebug和類似的工具對你想要顯示的內容做出假設。它們不一定是語言的完美表示,儘管如下回答,它通常最好只依賴JavaScript數組中的數字屬性。 – RightSaidFred

回答

53

數組有數字索引。所以,

a = new Array(); 
a['a1']='foo'; 
a['a2']='bar'; 

and 

b = new Array(2); 
b['b1']='foo'; 
b['b2']='bar'; 

不將元素添加到陣列中,但添加.a1.a2屬性到a對象(數組是對象太)。作爲進一步的證據,如果你這樣做:

a = new Array(); 
a['a1']='foo'; 
a['a2']='bar'; 
console.log(a.length); // outputs zero because there are no items in the array 

你的第三個選擇:

c=['c1','c2','c3']; 

與三個要素分配變量c的數組。這三個要素可以被訪問爲:c[0],c[1]c[2]。換句話說,c[0] === 'c1'c.length === 3

JavaScript不使用它的數組功能來處理其他語言所稱的關聯數組,其中您可以使用數組中的任何類型的鍵。您可以通過在JavaScript中使用一個對象來實現關聯數組的大部分功能,其中每個項目只是一個像這樣的屬性。

a = {}; 
a['a1']='foo'; 
a['a2']='bar'; 

它通常是使用數組用於此目的,因爲它只是混淆人閱讀你的代碼,並導致對代碼是如何工作的錯誤的假設是錯誤的。

+2

關於'a'和'b'的區別,我認爲它來自聲明'b = new Array(2);'。這裏你說「我的數字索引數組有2個項目」。而且因爲你什麼也沒有寫入'b [0]'和'b [1]',這就解釋了你在Firebug中得到的2個'undefined'。 – Rodolphe

+0

我明白了,謝謝!但爲什麼不jQuery的.each()與'a'數組一起工作? (請參閱編輯) – sbichenko

+0

有趣的是,請注意firebug如何將a視爲包含數組元素的對象。但是,它將b視爲一個沒有可見屬性的數組(雖然屬性確實存在)。唯一的區別是傳遞給Array構造函數的參數。我想知道這是爲什麼? –

3

陣列在JS具有兩種類型的屬性:

常規元件和締合性能(其只不過是對象)

當定義a = new Array(),要定義一個空數組。請注意,目前還沒有關聯對象

當您定義b = new Array(2)時,您正在定義具有兩個未定義位置的數組。

在'a'和'b'的例子中,您都要添加關聯屬性,即對象到這些數組。

console.log (a)console.log(b)分別打印數組元素,即[][undefined, undefined]。但由於a1/a2b1/b2是其數組內的關聯對象,因此只能通過console.log(a.a1, a.a2)記錄日誌類型