Come Accedere agli Elementi di un Array in Javascript
- Per accedere agli elementi di un array in Javascript si utilizza l'operatore
[]
con l'indice dell'elemento desiderato. - Gli indici degli array partono da 0, quindi il primo elemento si trova all'indice 0.
- Gli array in Javascript sono oggetti specializzati, e gli indici sono semplicemente nomi di proprietà che seguono regole specifiche.
- Non esiste l'errore di "sfondamento dei limiti" come in altri linguaggi; se si accede a un indice che non esiste, si ottiene
undefined
senza errori.
Lettura e Scrittura degli Elementi di un Array
Per accedere ad un elemento di un array si utilizza l'operatore []
.
Un riferimento all'array deve apparire a sinistra delle parentesi quadre. Un'espressione arbitraria che ha un valore intero non negativo dovrebbe essere all'interno delle parentesi quadre. Di conseguenza, la sintassi da adoperare è la seguente:
riferimento_array[indice]
Possiamo utilizzare questa sintassi sia per leggere che per scrivere il valore di un elemento di un array. Pertanto, le seguenti sono tutte istruzioni JavaScript valide:
let a = ["mondo"]; // Inizia con un array di un elemento
let valore = a[0]; // Legge l'elemento 0
a[1] = 3.14; // Scrive l'elemento 1
let i = 2;
a[i] = 3; // Scrive l'elemento 2
a[i + 1] = "ciao"; // Scrive l'elemento 3
a[a[i]] = a[0]; // Legge gli elementi 0 e 2, scrive l'elemento 3
La caratteristica speciale degli array è che quando si utilizzano nomi di proprietà che sono interi non negativi minori di length
al nostro posto. Nel precedente esempio, ad esempio, abbiamo creato un array a
con un singolo elemento. Abbiamo poi assegnato valori agli indici 1, 2 e 3. La proprietà length
dell'array è cambiata man mano che lo facevamo, quindi:
a.length // => 4
Ricordiamo che gli array sono un tipo specializzato di oggetto.
Le parentesi quadre utilizzate per accedere agli elementi dell'array funzionano proprio come le parentesi quadre utilizzate per accedere alle proprietà dell'oggetto. JavaScript converte l'indice numerico dell'array che specifichiamo in una stringa (ad esempio l'indice 1
diventa la stringa "1"
) quindi utilizza quella stringa come nome di proprietà. Non c'è nulla di speciale nella conversione dell'indice da numero a stringa. Possiamo farlo anche con gli oggetti regolari:
let o = {}; // Crea un oggetto semplice
o[1] = "uno"; // Lo indicizza con un intero
o["1"] // => "uno"; i nomi delle proprietà numeriche e stringa sono gli stessi
È utile distinguere chiaramente un indice dell'array da un nome di proprietà dell'oggetto. Tutti gli indici sono nomi di proprietà, ma solo i nomi di proprietà che sono interi tra length
secondo necessità.
Notiamo che possiamo indicizzare un array utilizzando numeri che sono negativi o che non sono interi. Quando facciamo questo, il numero viene convertito in una stringa, e quella stringa viene utilizzata come nome di proprietà. Poiché il nome non è un intero non negativo, viene trattato come una proprietà oggetto regolare, non un indice dell'array. Inoltre, se indicizziamo un array con una stringa che risulta essere un intero non negativo, si comporta come un indice dell'array, non una proprietà dell'oggetto. Lo stesso vale se utilizziamo un numero a virgola mobile che è lo stesso di un intero:
a[-1.23] = true; // Questo crea una proprietà chiamata "-1.23"
a["1000"] = 0; // Questo è il 1001° elemento dell'array
a[1.000] = 1; // Indice dell'array 1. Stesso di a[1] = 1;
Il fatto che gli indici dell'array siano semplicemente un tipo speciale di nome di proprietà dell'oggetto significa che per gli array JavaScript non esiste l'errore di sfondamento dei limiti che, invece, si presenta in altri linguaggi. In altri linguaggi, come il C o Java, se abbiamo un array di
Quando proviamo a interrogare una proprietà inesistente di qualsiasi oggetto, non otteniamo un errore; otteniamo semplicemente undefined
. Questo è altrettanto vero per gli array come lo è per gli oggetti:
let a = [true, false]; // Questo array ha elementi agli indici 0 e 1
a[2] // => undefined; nessun elemento a questo indice.
a[-1] // => undefined; nessuna proprietà con questo nome.