Un array è una lista ordinata
In JavaScript gli array contengono una sequenza ordinata di valori. I valori possono essere di qualsiasi tipo (numeri, stringhe, oggetti, persino altri array) e non devono essere tutti dello stesso tipo. Ne crei uno con le parentesi quadre:
Questa sintassi letterale è il modo in cui creerai gli array il 99% delle volte. Esiste anche new Array(...), ma ha un'insidia: new Array(3) crea un array di lunghezza 3 senza elementi reali, non [3]. Resta su [].
Gli indici partono da zero
Accedi agli elementi per posizione, a partire da 0:
Due cose da notare. Primo, accedere oltre la fine dell'array non genera un errore: restituisce undefined. È una fonte comune di bug del tipo "perché questo è undefined?". Secondo, puoi assegnare a qualsiasi indice, anche oltre la fine, e JavaScript allungherà l'array senza lamentarsi:
Le posizioni 3 e 4 diventano "slot vuoti" (buchi di un array sparso). La lunghezza salta a 6. Raramente è quello che vuoi: è un effetto collaterale della flessibilità degli array, non una funzionalità su cui contare.
length è sempre aggiornato
array.length è sempre uguale all'indice più alto più uno. Si aggiorna da solo quando aggiungi o rimuovi elementi:
Vale la pena ricordare quest'ultimo trucco: assegnare un valore a length tronca l'array. Impostare nums.length = 0 è un modo rapido per svuotarlo sul posto.
push, pop, shift, unshift
Quattro metodi per aggiungere e rimuovere elementi alle estremità:
push(x)aggiunge alla fine e restituisce la nuova lunghezza.pop()rimuove dalla fine e restituisce l'elemento rimosso.unshift(x)aggiunge all'inizio.shift()rimuove dall'inizio.
push/pop sono veloci. shift/unshift devono reindicizzare tutti gli altri elementi, quindi sono più lenti sugli array grandi: nessun problema con le dimensioni di tutti i giorni, ma è bene saperlo se lavori con milioni di elementi.
slice vs splice
Questi due hanno nomi simili e comportamenti completamente diversi. Tienili ben distinti e ti risparmierai parecchi grattacapi.
slice(start, end) restituisce una copia di una parte dell'array. L'originale non viene toccato. end è escluso:
splice(start, deleteCount, ...items) modifica l'array. Può eliminare, inserire o entrambe le cose, e restituisce ciò che ha rimosso:
Regola pratica: se la parola ti fa pensare a tagliare una fetta (slice) da una pagnotta, è slice. Se ti fa pensare al montaggio di una pellicola (splice: tagliare e inserire), è splice.
Cercare elementi: indexOf, includes, find
Tre modi per cercare qualcosa, per situazioni diverse:
indexOf(x)ti dà la posizione, oppure-1se non lo trova. Utile quando ti serve l'indice.includes(x)ti dà un booleano. È più pulito quando vuoi solo sapere "c'è o non c'è?". Gestisce anche correttamenteNaN, cosa cheindexOfnon fa.find(predicate)esegue una funzione per ogni elemento e restituisce il primo che corrisponde. È quello giusto per gli array di oggetti, doveindexOfeincludesfanno solo confronti di uguaglianza stretta.
Scorrere un array
Ci sono alcuni buoni modi, ognuno adatto a una situazione diversa:
for...of è la scelta predefinita: leggibile, funziona con qualsiasi iterabile e ti dà direttamente il valore. forEach va bene quando ti serve anche l'indice e non devi uscire dal ciclo in anticipo (non puoi usare break dentro forEach). Il classico for con l'indice è prolisso ma ti dà il pieno controllo: usalo quando devi saltare elementi, scorrere all'indietro o entrambe le cose.
Un ciclo da evitare: for...in. Itera sulle chiavi e include le proprietà ereditate. Serve per gli oggetti, non per gli array.
Copiare e combinare
Gli array sono valori per riferimento. Assegnarne uno a un'altra variabile non lo copia: crea due nomi per lo stesso array:
Per copiarlo davvero, usa l'operatore spread oppure slice():
Entrambi producono una copia superficiale: l'array di primo livello è nuovo, ma se gli elementi sono oggetti, quegli oggetti restano condivisi. Lo spread è anche il modo più pulito per combinare array:
Array di oggetti
Nel codice reale, la maggior parte degli array contiene oggetti. Gli stessi metodi funzionano, ma il confronto diventa più interessante:
filter restituisce un nuovo array con gli elementi che soddisfano un predicato. map restituisce un nuovo array in cui ogni elemento è trasformato. Concatenarli è il pane quotidiano quando lavori con array di oggetti, e la prossima pagina della documentazione approfondisce questa famiglia di metodi.
Array e oggetti a confronto
Un modello mentale veloce: usa un array quando l'ordine conta e lavori con una lista di cose dello stesso tipo. Usa un oggetto (o una Map) quando accedi alle cose per nome. "Primo, secondo, terzo" è territorio degli array. "Trova l'utente con id 42" è territorio degli oggetti o delle Map.
Puoi combinarli (gli array di oggetti sono ovunque), ma non usare un array come dizionario con chiavi e non usare un oggetto come lista ordinata. Ognuno fa bene un lavoro solo.
Prossimo passo: destructuring
Estrarre valori dagli array per indice (e proprietà dagli oggetti per nome) capita così spesso che JavaScript ha una sintassi dedicata. Si chiama destructuring, ed è il prossimo argomento.
Domande frequenti
Come si crea un array in JavaScript?
Il modo idiomatico è la sintassi letterale con le parentesi quadre: const fruits = ['apple', 'banana']. Il costruttore Array (new Array(3)) esiste, ma quasi mai è quello che vuoi: new Array(3) crea un array di lunghezza 3 senza elementi reali, e questo sorprende molti.
Come rimuovo un elemento da un array in JavaScript?
Dalla fine, usa pop(). Dall'inizio, usa shift(). Da una posizione qualsiasi nel mezzo, usa splice(index, 1) per modificare l'array sul posto, oppure filter(...) per ottenere un nuovo array senza quell'elemento. splice cambia l'originale; filter no.
Qual è la differenza tra slice e splice?
slice(start, end) restituisce una copia superficiale di una parte dell'array e lascia intatto l'originale. splice(start, deleteCount, ...items) modifica l'originale: rimuove elementi, eventualmente ne inserisce di nuovi e restituisce quelli rimossi. Una sola lettera di differenza, comportamento completamente diverso.
Come controllo se un valore è presente in un array JavaScript?
Usa array.includes(value): restituisce true o false e gestisce correttamente NaN. indexOf(value) restituisce la posizione oppure -1 se non lo trova, utile quando ti serve anche l'indice. Per confronti più complessi, usa some(predicate) o find(predicate).