Const in javascript? Quando usarlo ed è necessario

Recentemente ho trovato la parola chiave const in javascript. Da quello che posso dire, è usato per creare variabili immutabili , e ho provato a verificare che non possa essere ridefinito (in node.js):

const x = 'const'; const x = 'not-const'; // Will give an error: 'constant 'x' has already been defined' 

Mi rendo conto che non è ancora standardizzato su tutti i browser, ma mi interessa solo il contesto di node.js / v8, e ho notato che alcuni sviluppatori / progetti sembrano preferire fortemente quando la parola chiave var può essere utilizzata allo stesso effetto.

Domande ?

Quando è opportuno utilizzare const al posto di var ?

Dovrebbe essere usato ogni volta che viene dichiarata una variabile che non verrà riassegnata?

In realtà fa alcuna differenza se var è usato al posto di const o viceversa?

Ci sono due aspetti per le tue domande: quali sono gli aspetti tecnici dell’uso di const anziché di var e quali sono gli aspetti correlati all’uomo di farlo.

La differenza tecnica è significativa. Nei linguaggi compilati, una costante verrà sostituita in fase di compilazione e il suo utilizzo consentirà altre ottimizzazioni come la rimozione del codice morto per aumentare ulteriormente l’efficienza di runtime del codice. I motori JavaScript (a lungo termine usati) in tempo reale compilano il codice JS per ottenere prestazioni migliori, quindi l’uso della parola chiave const informsrà che le ottimizzazioni descritte sopra sono possibili e dovrebbero essere eseguite. Ciò si traduce in prestazioni migliori.

L’aspetto correlato all’uomo riguarda la semantica della parola chiave. Una variabile è una struttura di dati che contiene informazioni che si prevede cambieranno. Una costante è una struttura di dati che contiene informazioni che non cambieranno mai. Se c’è spazio per errori, var dovrebbe sempre essere usato. Tuttavia, non tutte le informazioni che non cambiano mai nella vita di un programma devono essere dichiarate con const . Se in circostanze diverse le informazioni dovessero cambiare, usare var per indicare che, anche se la modifica effettiva non appare nel codice.

Aggiornamento 2017

Questa risposta riceve ancora molta attenzione. Vale la pena notare che questa risposta è stata postata all’inizio del 2014 e molto è cambiato da allora. il supporto di ecmascript-6 è ora la norma. Tutti i browser moderni ora supportano const quindi dovrebbe essere abbastanza sicuro da usare senza problemi.


Risposta originale dal 2014

Nonostante abbia un supporto browser abbastanza decente , eviterei di usarlo per ora. Dall’articolo di MDN su const :

L’attuale implementazione di const è un’estensione specifica di Mozilla e non fa parte di ECMAScript 5. È supportata in Firefox e Chrome (V8). A partire da Safari 5.1.7 e Opera 12.00, se si definisce una variabile con const in questi browser, è comunque ansible modificarne il valore in seguito. Non è supportato in Internet Explorer 6-10, ma è incluso in Internet Explorer 11. La parola chiave const attualmente dichiara la costante nell’ambito della funzione (come le variabili dichiarate con var).

Poi continua dicendo:

const sarà definito da ECMAScript 6, ma con semantica diversa. Analogamente alle variabili dichiarate con l’istruzione let, le costanti dichiarate con const avranno scope-scope.

Se si utilizza const , sarà necessario aggiungere una soluzione alternativa per supportare browser leggermente più vecchi.

Per integrare le risposte precedenti, c’è un ovvio vantaggio nel dichiarare le variabili costanti, a parte il motivo della prestazione: se accidentalmente provi a cambiarle o re-dichiararle nel codice, il programma non modificherà il valore o genererà un errore.

Ad esempio, confronta:

 // Will output 'SECRET' const x = 'SECRET' if (x = 'ANOTHER_SECRET') { // Warning! assigning a value variable in an if condition console.log (x) } 

con:

 // Will output 'ANOTHER_SECRET' var y = 'SECRET' if (y = 'ANOTHER_SECRET') { console.log (y) } 

o

 // Will throw TypeError: const 'x' has already been declared const x = "SECRET" /* complex code */ var x = 0 

con

 // Will reassign y and cause trouble var y = "SECRET" /* complex code */ var y = 0 

const non è immutabile.

Dal MDN :

La dichiarazione const crea un riferimento di sola lettura a un valore. Non significa che il valore che detiene è immutabile, solo che l’identificatore di variabile non può essere riassegnato.

Perché usare const , la risposta di @ Tibos è grandiosa.

Ma hai detto:

Da quello che posso dire, è usato per creare variabili immutabili

È sbagliato La modifica di una variabile è diversa dalla riassegnazione:

 var hello = 'world' // assigning hello = 'bonjour!' // reassigning 

Con const, non puoi farlo:

 const hello = 'world' hello = 'bonjour!' // error 

Ma puoi modificare la tua variabile:

 const marks = [92, 83] marks.push(95) console.log(marks) // [92, 83, 95] -> the variable has been mutated. 

Quindi, qualsiasi processo che modifica il valore della variabile senza utilizzare il segno = è distriggersto.

Nota: += per esempio è … riassegnazione!

 var a = 5 a += 2 // is the same as a = a + 2 

Quindi, la linea di fondo è: const non ti impedisce di mutare le variabili, ti impedisce di riassegnarle .

Hai grandi risposte, ma facciamo in modo che sia semplice.

const dovrebbe essere usato quando hai una costante definita (leggi come: non cambierà durante l’esecuzione del programma).

Per esempio:

 const pi = 3.1415926535 

Se pensi che sia qualcosa che potrebbe essere cambiato nell’esecuzione successiva, usa una var .

La differenza pratica, basata sull’esempio, è che con const si citerà sempre che pi sarà 3.14 […], è un dato di fatto.

Se lo si definisce come var , potrebbe essere 3.14 […] o meno.

Per una risposta più tecnica @Tibos è accademicamente giusto.

Nella mia esperienza, utilizzo const quando voglio impostare qualcosa che potrei voler cambiare in seguito senza dover cercare il codice cercando bit che sono stati codificati, ad esempio un percorso file o un nome server.

L’errore nel test è un’altra cosa, però, si sta tentando di creare un’altra variabile chiamata x, questo sarebbe un test più accurato.

 const x = 'const'; x = 'not-const'; 

Preferenza personale davvero Puoi usare const quando, come dici tu, non sarà riassegnato ed è costante. Ad esempio se volessi assegnare il tuo compleanno. Il tuo compleanno non cambia mai, quindi potresti usarlo come costante. Ma la tua età cambia così che potrebbe essere una variabile.

Fornisce: 1) un riferimento costante, ad esempio const x = [] – la matrice può essere modificata, ma x non può puntare a un’altra matrice; e 2) scope scope. const e let sostituiranno insieme var in ecma6 / 2015 Vedi la discussione su https://strongloop.com/strongblog/es6-variable-declarations/

Innanzitutto, tre cose utili su const (oltre ai miglioramenti dell’ambito condiviso con let ):

  • Documenta per le persone che leggono il codice in seguito che il valore non deve cambiare.
  • Impedisce a te (oa chiunque ti segua) di modificare il valore a meno che non torni indietro e cambi la dichiarazione intenzionalmente.
  • Potrebbe salvare il motore JavaScript alcune analisi in termini di ottimizzazione. Ad esempio, hai dichiarato che il valore non può cambiare, quindi il motore non deve lavorare per capire se il valore cambia in modo che possa decidere se ottimizzare in base al valore che non cambia.

Le tue domande:

Quando è opportuno utilizzare const al posto di var ?

Puoi farlo ogni volta che dichiari una variabile il cui valore non cambia mai. Se lo ritieni appropriato, dipende interamente dalle tue preferenze / preferenze della tua squadra.

Dovrebbe essere usato ogni volta che viene dichiarata una variabile che non verrà riassegnata?

Dipende da te / dalla tua squadra.

In realtà fa alcuna differenza se var is used in place of const o viceversa?

Sì:

  • var e const hanno regole di ambito differenti. (Potrebbe essere necessario confrontare con let piuttosto che var .) Specificamente: const e let sono a scope e, se utilizzati nell’ambito globale, non creano proprietà sull’object globale (anche se creano globals). var ha uno scope globale (se usato nell’ambito globale) o un ambito di funzione (anche se usato in un blocco) e, se utilizzato nell’ambito globale, crea una proprietà sull’object globale.
  • Vedi le mie “tre cose utili” sopra, si applicano tutte a questa domanda.

Sommario:

const crea un significato di legame immutabile l’ identificatore della variabile const non è riassegnabile.

 const a = "value1"; 

non puoi riassegnarlo con

 a = "value2"; 

Tuttavia, se l’identificatore const contiene un object o un array, il valore di esso può essere modificato per quanto non lo stiamo riassegnando.

 const x = { a: 1 } xa = 2; //is possible and allowed const numbers = [1, 2]; numbers.push(3); //is possible and allowed 

Si noti che const ha un ambito di blocco proprio come let, che non è lo stesso di var (che ha lo scopo della funzione)

In breve, quando qualcosa non è suscettibile di cambiare attraverso la riassegnazione usa const else usa let o var a seconda dell’ambito che vorresti avere.

È molto più facile ragionare sul codice quando è ovvio che cosa può essere cambiato attraverso la riassegnazione e ciò che non può essere. Cambiare un const in let è semplice. E andando const di default ti fa pensare due volte prima di farlo. E questo è in molti casi una buona cosa.

 Main point is that how to decide which one identifier should be used during development. In java-script here are three identifiers. 1. var (Can re-declared & re-initialize) 2. const (Can't re-declared & re-initialize, can update array values by using push) 3. let (Can re-initialize but can't re-declare) 

‘var’: al momento della codifica quando parliamo di standard di codice, usiamo solitamente il nome dell’identificatore che è facilmente comprensibile da parte di altri utenti / sviluppatori. Per esempio se stiamo lavorando abbiamo pensato a molte funzioni in cui usiamo qualche input e processiamo questo e restituiamo alcuni risultati, come:

 **Example of variable use** function firstFunction(input1,input2) { var process = input1 + 2; var result = process - input2; return result; } function otherFunction(input1,input2) { var process = input1 + 8; var result = process * input2; return result; } 

Negli esempi precedenti entrambe le funzioni producono risultati diversi-2 ma usano lo stesso nome di variabili. Qui possiamo vedere ‘processo’ e ‘risultato’ entrambi sono usati come variabili e dovrebbero essere.

  **Example of constant with variable** const tax = 10; const pi = 3.1415926535; function firstFunction(input1,input2) { var process = input1 + 2; var result = process - input2; result = (result * tax)/100; return result; } function otherFunction(input1,input2) { var process = input1 + 8; var result = process * input2 * pi; return result; } 

Prima di usare ‘let’ in java-script dobbiamo aggiungere ‘use strict’ nella parte superiore del file js

  **Example of let with constant & variable** const tax = 10; const pi = 3.1415926535; let trackExecution = ''; function firstFunction(input1,input2) { trackExecution += 'On firstFunction'; var process = input1 + 2; var result = process - input2; result = (result * tax)/100; return result; } function otherFunction(input1,input2) { trackExecution += 'On otherFunction'; # can add current time var process = input1 + 8; var result = process * input2 * pi; return result; } firstFunction(); otherFunction(); console.log(trackExecution); 

Nell’esempio precedente è ansible tenere traccia di quale funzione viene eseguita quando & quale funzione non viene utilizzata durante un’azione specifica.

var : dichiara una variabile, l’inizializzazione del valore opzionale.

let : dichiara una variabile locale con ambito di blocco.

const : dichiara una costante denominata di sola lettura.

Ex:

 var a; a = 1; a = 2;//re-initialize possible var a = 3;//re-declare console.log(a);//3 let b; b = 5; b = 6;//re-initiliaze possible // let b = 7; //re-declare not possible console.log(b); // const c; // c = 9; //initialization and declaration at same place const c = 9; // const c = 9;// re-declare and initialization is not possible console.log(c);//9 // NOTE: Constants can be declared with uppercase or lowercase, but a common // convention is to use all-uppercase letters. 

‘const’ indica al tuo codice che l’identificatore non verrà riassegnato. Questo è un buon articolo su quando usare ‘const’, ‘let’ o ‘var’ https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.ukgxpfhao

Non sono un esperto nel settore della compilazione JS, ma ha senso dire che v8 si avvale della flag const

Normalmente a dopo aver dichiarato e modificato un gruppo di variabili, la memoria si frammenta e v8 si ferma per eseguire, fa una pausa di alcuni secondi, per fare gc, o garbage collection.

se una variabile è dichiarata con const v8 puoi essere sicuro di metterla in un contenitore di dimensioni fisse strette tra altre variabili const, poiché non cambierà mai. Può anche salvare le operazioni corrette per quei tipi di dati poiché il tipo non cambierà.