La semantica di var
elet
var
e let
sono 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 var
elet
var
e let
costringere 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 const
dichiarazione è mutabile. È possibile aggiungere o rimuovere elementi da un const
array referenziato e mutare le chiavi delle proprietà su un const
oggetto referenziato.
Per ottenere oggetti immutabili (che ancora una volta, rendono più facile ragionare il tuo codice per esseri umani e macchine), puoi Object.freeze
l'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 var
e let
sono una buona partita
let
e var
rappresentano 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
.