2011-11-23 14 views
40

consideri l'esempio di codice JavaScript:JavaScript dichiarazione di matrice: new Array(), new Array (3), [ 'a', 'b', 'c'] creare array che si comportano in modo diverso

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

Risultati nella console Firebug sono i seguenti:

per una (la '[]' doveva essere ampliata facendo clic sul pulsante '+'):

[]  
a1 "foo" 
a2 "bar" 

per B:

[undefined, undefined] 

per C:

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

Le mie domande sono:

  1. Sto usando la matrice della sintassi [ 'chiave'] 'value' = correttamente?
  2. Perché la matrice b non funziona come previsto?
  3. Perché gli array a e c sono visualizzati in modo diverso nella console? Sembra anche che jQuery non sia in grado di scorrere l'array a con il suo metodo .each().
  4. Potresti raccomandare qualche buon tutorial sul comportamento degli array Javascript?

NOTA: Firebug di Google Chrome visualizza solo [] per serie 'a', senza la possibilità di espanderla.

MODIFICA: OK, sembra che gli array in Javascript abbiano solo chiavi numeriche, quindi aggiungere una stringa come nome di chiave rende un oggetto fuori da un array. Ma perché jQuery non funziona?

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

Questo codice, aggiunto allo script, non genera avvisi.

+1

Stai confondendo gli oggetti array di JavaScript con gli array associativi disponibili in lingue come PHP. Gli array JavaScript utilizzano solo indici numerici. Usando la sintassi 'a ['a1'] = val' aggiunge una proprietà' a1' all'oggetto 'a', non un valore di matrice. –

+0

@ P.Brian.Mackey: Probabilmente perché questo tipo di domande è stato chiesto molte volte su SO. – RightSaidFred

+1

@exizt: Firebug e strumenti simili fanno presupposizioni su ciò che si desidera visualizzare. Non sono necessariamente una rappresentazione prefettizia della lingua, anche se, come indicato di seguito, è * generalmente * il migliore per fare affidamento solo su proprietà numeriche negli array JavaScript. – RightSaidFred

risposta

53

Gli array dispongono di indici numerici. Quindi,

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

and 

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

non stanno aggiungendo elementi alla matrice, ma aggiungendo .a1 e .a2 proprietà all'oggetto a (array sono oggetti troppo). Come ulteriore prova, se avete fatto queste cose:

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

tua terza opzione:

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

sta assegnando alla variabile c un array con tre elementi. Questi tre elementi sono accessibili come: c[0], c[1] e c[2]. In altre parole, c[0] === 'c1' e c.length === 3.

Javascript non usa la sua funzionalità di matrice per ciò che altri linguaggi chiamano array associativi in ​​cui è possibile utilizzare qualsiasi tipo di chiave nell'array. È possibile implementare la maggior parte delle funzionalità di un array associativo utilizzando semplicemente un oggetto in javascript in cui ogni elemento è solo una proprietà come questa.

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

è generalmente un errore di utilizzare un array per questo scopo in quanto confonde persone che leggono il codice e porta a false ipotesi su come funziona il codice.

+2

E per quanto riguarda la differenza tra 'a' e' b', penso che provenga dalla dichiarazione 'b = new Array (2);'. Qui stai dicendo "il mio array con indici numerici ha 2 elementi". E dal momento che non metti niente in 'b [0]' e 'b [1]', questo spiega il 2 'indefinito' di Firebug. – Rodolphe

+0

Vedo, grazie! Ma perché jeach() non funziona con l'array 'a'? (Vedi modifica) – sbichenko

+0

È interessante notare come firebug considera a come un oggetto che contiene un elemento di matrice. Ma tratta b come una matrice senza proprietà visibili (sebbene le proprietà esistano). Dove l'unica differenza è il parametro passato al costruttore Array. Mi chiedo perché questo sia? –

3

matrici in JS hanno due tipi di proprietà:

elementi regolari e proprietà associativi (che non sono altro che oggetti)

Quando definite a = new Array(), si definisce un array vuoto. Nota che non ci sono ancora oggetti associativi

Quando si definisce b = new Array(2), si sta definendo un array con due posizioni non definite.

In entrambi gli esempi di 'a' e 'b', si aggiungono proprietà associative, ad esempio oggetti a questi array.

console.log (a) o console.log(b) stampa gli elementi dell'array, ad esempio [] e [undefined, undefined] rispettivamente. Ma poiché a1/a2 e b1/b2 sono oggetti associativi all'interno dei loro array, possono essere registrati solo tramite il tipo di sintassi console.log(a.a1, a.a2)