La semantica di varelet
vare letsono una dichiarazione alla macchina e ad altri programmatori:
Intendo che il valore di questo incarico cambi nel corso dell'esecuzione. Non fare affidamento sul valore finale di questa assegnazione.
Implicazioni dell'uso di varelet
vare letcostringere gli altri programmatori a leggere tutto il codice che intercorre tra la dichiarazione e l'uso finale, e ragionare sul valore dell'assegnazione in quel punto nell'esecuzione del programma.
Esse indeboliscono il ragionamento automatico per ESLint e altri servizi linguistici per rilevare correttamente i nomi delle variabili erroneamente assegnati nelle assegnazioni successive e il riutilizzo dell'ambito dei nomi delle variabili dell'ambito esterno in cui l'ambito interno dimentica di dichiarare.
Inoltre, fanno sì che i runtime eseguano molte iterazioni su tutti i codepati per rilevare che sono effettivamente, in effetti, costanti, prima che possano ottimizzarli. Anche se questo è meno un problema del rilevamento dei bug e della comprensibilità degli sviluppatori.
Quando usare const
Se il valore del riferimento non cambia nel corso dell'esecuzione, la sintassi corretta per esprimere l'intenzione del programmatore è const. Per gli oggetti, cambiare il valore del riferimento significa indicare un altro oggetto, poiché il riferimento è immutabile, ma l'oggetto no.
" const" oggetti
Per i riferimenti a oggetti, il puntatore non può essere modificato in un altro oggetto, ma l'oggetto che viene creato e assegnato a una constdichiarazione è mutabile. È possibile aggiungere o rimuovere elementi da un constarray referenziato e mutare le chiavi delle proprietà su un constoggetto referenziato.
Per ottenere oggetti immutabili (che ancora una volta, rendono più facile ragionare il tuo codice per esseri umani e macchine), puoi Object.freezel'oggetto alla dichiarazione / assegnazione / creazione, come questo:
const Options = Object.freeze(['YES', 'NO'])
Object.freeze ha un impatto sulle prestazioni, ma il codice è probabilmente lento per altri motivi. Vuoi profilarlo.
È inoltre possibile incapsulare l'oggetto mutabile in una macchina a stati e restituire copie profonde come valori (è così che funzionano gli stati Redux e React). Vedi Come evitare lo stato globale mutabile in Browser JS per un esempio di come costruire questo dai primi principi.
Quando vare letsono una buona partita
lete varrappresentano lo stato mutabile. A mio avviso, dovrebbero essere usati solo per modellare lo stato mutabile reale . Cose come " la connessione è viva? ".
Questi sono meglio incapsulati in macchine a stati verificabili che espongono valori costanti che rappresentano " lo stato corrente della connessione ", che è una costante in qualsiasi momento nel tempo e ciò a cui il resto del codice è effettivamente interessato.
La programmazione è già abbastanza difficile con la composizione di effetti collaterali e la trasformazione dei dati. Trasformando ogni funzione in una macchina a stati non verificabile creando uno stato mutabile con variabili che si accumulano solo sulla complessità.
Per una spiegazione più sfumata, vedi Shun the Mutant - The case forconst .