2011-11-23 11 views
40

Rozważmy przykład kod Javascript:JavaScript deklaracji tablicy: New Array(), nowe Array (3) [ 'a', 'b', 'c'] tworzenia tablic, które zachowują się w różny sposób

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); 

Wyniki w konsoli Firebug są następujące:

do a ('[]' musiały być rozszerzona przez kliknięcie przycisku '+')

[]  
a1 "foo" 
a2 "bar" 

B:

[undefined, undefined] 

dla C:

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

moje pytania są następujące:

  1. używam tablicy składnia [ 'klucz'] = 'wartość' = prawidłowo?
  2. Dlaczego tablica b nie działa zgodnie z oczekiwaniami?
  3. Dlaczego tablice a i c wyświetlane są inaczej w konsoli? Wydaje się również, że jQuery nie jest w stanie iterować poprzez tablicę a przy użyciu metody .each().
  4. Czy możesz polecić jakieś dobre samouczki dotyczące zachowania tablicy JavaScript?

UWAGA: Google Chrome Firebug wyświetla tylko [] na tablicy 'a', bez opcji, aby go rozwinąć.

EDIT: W porządku, wydaje się, że tablice w JavaScript mają tylko klawisze numeryczne, więc dodając ciąg jako kluczowy nazwa sprawia, że ​​obiekt z tablicy. Ale dlaczego jQuery nie współpracuje z jQuery?

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

Ten kod, dołączony do skryptu, nie generuje alertów.

+1

Mylicie obiekty tablicowe JavaScript z tablicami asocjacyjnymi dostępnymi w językach takich jak PHP. Tablice JavaScript używają tylko indeksów numerycznych. Używanie składni 'a ['a1'] = val' dodaje właściwość' a1' do obiektu 'a', a nie wartość tablicy. –

+0

@ P.Brian.Mackey: Prawdopodobnie dlatego, że tego rodzaju pytanie było zadawane wiele razy na SO. – RightSaidFred

+1

@exizt: Firebug i podobne narzędzia tworzą założenia dotyczące tego, co chcesz wyświetlić. Niekoniecznie są one doskonałą reprezentacją tego języka, chociaż zgodnie z poniższą odpowiedzą, zwykle najlepiej jest polegać wyłącznie na właściwościach numerycznych w tablicach JavaScript. – RightSaidFred

Odpowiedz

53

Tablice mają indeksy numeryczne. Tak więc,

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

and 

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

nie dodanie elementów do tablicy, ale dodanie .a1 i .a2 właściwości do obiektu a (tablice są obiekty zbyt). Jako kolejny dowód, jeśli to zrobił:

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

Twoja trzecia opcja:

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

jest przypisanie zmiennej c tablicę z trzema elementami. Te trzy elementy mogą być dostępne jako: c[0], c[1] i c[2]. Innymi słowy, c[0] === 'c1' i c.length === 3.

Javascript nie używa swojej funkcji tablicowej do tego, co inne języki nazywają tablicami asocjacyjnymi, w których można użyć dowolnego typu klucza w tablicy. Możesz wdrożyć większość funkcjonalności tablicy asocjacyjnej, używając tylko obiektu w javascript, gdzie każdy element jest po prostu taką właściwością.

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

Jest ogólnie błędem używać tablicy do tego celu, jak to tylko dezorientuje ludzi do czytania kodu i prowadzi do błędnych założeń o tym, jak kod działa.

+2

Co do różnicy między 'a' i' b', myślę, że pochodzi od deklaracji 'b = new Array (2);'. Tutaj mówisz "moja tablica indeksowana ma 2 elementy". A ponieważ nic nie wkładasz w 'b [0]' i 'b [1]', to wyjaśnia 2 'niezdefiniowane', które dostajesz w Firebug. – Rodolphe

+0

Rozumiem, dziękuję! Ale dlaczego metoda .each (jQuery) nie działa z tablicą "a"? (Patrz edytuj) – sbichenko

+0

Warto zauważyć, jak firebug traktuje obiekt jako obiekt zawierający element tablicy. Ale traktuje b jako tablicę bez widocznych właściwości (chociaż właściwości istnieją). Gdzie jedyną różnicą jest parametr przekazany do konstruktora Array. Zastanawiam się, dlaczego tak jest? –

3

Tablice w JS mają dwa rodzaje obiektów:

regularne elementy i właściwości asocjacyjne (które są tylko obiektami)

Podczas definiowania a = new Array(), definiowania pustą tablicę. Zauważ, że nie ma jeszcze obiektów asocjacyjnych.

Po zdefiniowaniu b = new Array(2) definiujesz tablicę z dwoma niezdefiniowanymi lokalizacjami.

W obu przykładach "a" i "b" dodajesz właściwości asocjacyjne, tj. Obiekty do tych tablic.

console.log (a) lub console.log(b) drukuje elementy tablicy, np. [] i [undefined, undefined] odpowiednio. Ale ponieważ a1/a2 i b1/b2 są obiektami asocjacyjnymi wewnątrz ich tablic, mogą być rejestrowane tylko przez console.log(a.a1, a.a2) rodzaj składni