2011-12-25 33 views
30

Perché utilizzare le stringhe come chiavi di un array, la console sta mostrando quell'array senza questi valori dichiarati e mentre sta eseguendo l'iterazione con questi valori dove le chiavi non sono visualizzate? , anche se posso ottenerne il valore.Stringhe come chiavi di array in javascript

>> var arr = [ 0, 1, 2, 3 ]; 
    undefined 

>> arr["something"] = "aught"; 
    "aught" 

>> arr 
    [0, 1, 2, 3] 

>> arr["something"] 
    "aught" 

>> for(var i = arr.length; i--; console.log(arr[ i ])); 
    3 
    2 
    1 
    0 

Capisco che gli array sono oggetti che ha messo in atto qualche tipo di interfaccia 'enumerate' nel motore di JavaScript. La cosa più interessante è che l'interprete non lancia alcun avvertimento o errore quindi ho trascorso un po 'di tempo a cercare dove i dati potrebbero essere persi. Ora, ho sbagliato e ho usato [] anziché {}

risposta

69

In JavaScript ci sono 2 tipi di matrici: matrici standard e array associativi

  • [ ] - matrice serie - 0 indici interi basate solo
  • { } - array associativo - oggetti JavaScript in cui le chiavi può essere qualsiasi stringa

Così, quando si definiscono:

var arr = [ 0, 1, 2, 3 ]; 

Si sta definendo un array standard in cui gli indici possono essere solo numeri interi. Quando si esegue arr["something"] dal something (che è ciò che si utilizza come indice) non è un intero, si sta sostanzialmente definendo una proprietà per l'oggetto arr (tutto è oggetto in javascript). Ma non stai aggiungendo un elemento alla matrice standard.

+2

@abuduba, perché non c'è niente di sbagliato :-) Il tuo codice è perfettamente valido javascript. È ambiguo per il lettore poiché stai mescolando i 2 tipi di array ma è valido. Perché vorresti che l'interprete indichi che qualcosa non va quando non c'è niente di sbagliato. –

+18

Questo è principalmente un problema di terminologia, ma javascript NON chiama in genere '{}' un array associativo. Lo chiamano un oggetto che ha proprietà. La maggior parte delle persone non è d'accordo sul fatto che è meglio non confondere le cose chiamando un oggetto javascript un array associativo? – jfriend00

+1

Nota: Se si tenta di utilizzare '' defineProperty'' sull'array come '' Object.defineProperty.call (arr, 'qualcosa', 'aught'); '' genererà un errore. – David

9

for(var i = arr.length; i--; console.log(arr[ i ]));

Questo solo vi darà gli indici numerici, naturalmente, ma è ancora possibile ciclare su entrambi gli indici numerici e chiavi stringa della matrice come questo:

for (var x in arr) { 
    console.log(x + ": " + arr[x]); 
} 
/* (console output): 
    0: 0 
    1: 1 
    2: 2 
    3: 3 
    something: aught 
*/ 
+1

quindi, aggiungiamo questo 'Array.prototype.somethingCool =" not really ";' e quindi esegui il for-in-loop !! – KhaledMohamedP

Problemi correlati