2015-01-25 16 views
36

Come io.js ora supports ES6 si è finalmente in grado di utilizzare le parole chiave const e let. Ovviamente, let è il successore di var, solo con alcuni superpoteri.const vs let quando si chiama richiede

Ma che dire di const? So, ovviamente, che cosa significa "costante", ma mi stavo chiedendo quando usarlo (per quanto riguarda le migliori pratiche).

esempio se creo un modulo che richiede un altro modulo, potrei scrivere:

'use strict'; 

const util = require('util'); 

const foo = function() { 
    // Do something with util 
}; 

module.exports = foo; 

Fondamentalmente ho sostituito ogni occorrenza di var con const. In generale, penso che questo sia ok, ma se seguo questo schema, mi lascia molto più usi di const rispetto a let, poiché la maggior parte delle variabili non sono "variabili" in senso letterale.

È questo buono stile? Dovrei preferire il let? Quando dovrei scegliere const su let?

+1

Mi aspetterei che 'const' sia tutto in maiuscolo, come' const KEY_A = 65' per esempio. – elclanrs

+2

Il modo in cui penso a questo, è che un 'const' dovrebbe essere usato se il valore non deve mai essere cambiato, o, soprattutto, protetto dal cambiamento. 'let' dovrebbe essere usato quando il valore deve essere sovrascritto/modificato in seguito, ed entrambi dovrebbero essere usati quando è necessaria una variabile con scope a blocchi e non una variabile con scope per una funzione. Se hai bisogno di una variabile scope della funzione, 'var' è ancora disponibile. Potrei sbagliarmi, non ho letto molto su ES6/2015. – adeneo

+1

Dichiarare 'util' come' const' significa solo che quella variabile non può essere impostata su un valore diverso. ** Tuttavia **, è ancora possibile aggiungere, modificare e rimuovere proprietà da esso se non è una primitiva. – idbehold

risposta

35

const può essere normalmente utilizzato quando non si desidera che il programma di

  1. per assegnare nulla alla variabile

    "use strict"; 
    const a = 1; 
    a = 2; 
    

    produrrà TypeError: Assignment to constant variable..

  2. per utilizzare la variabile senza inizializzarsi esplicitamente.

    "use strict"; 
    const a; 
    

    produrrà SyntaxError: Unexpected token ;

In poche parole, direi,

  • uso const quando vuoi alcune variabili non devono essere modificati

  • uso let se vuoi l'esatto opposto di const

  • utilizzare var, se si desidera essere compatibili con le implementazioni ES5 o se si desidera l'ambito di livello modulo/funzione.

Utilizzare let solo quando è necessario bloccare il livello di scoping, altrimenti utilizzando let o var non avrebbe alcuna differenza.

+3

In realtà, 'let' e' const' si sollevano, ma è un po 'più complicato di così: http://stackoverflow.com/q/31219420/3242070 –

+0

Non penso che la prima metà di questo sia corretta. L'esempio con 'A_CONST' effettivamente lancia un errore. 'const' e' let' sono entrambi sollevati, ma sono soggetti alla ["zona morta temporale"] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let) in modo che non possano essere utilizzati prima della dichiarazione. – ZachB

+1

@ ZachB Sono d'accordo. A mia difesa, 'const' si comportava in modo diverso in modalità sciatta. [Ref] (https: // GitHub.com/nodejs/node/tirare/3152 # discussion_r41552676). Grazie per aver segnalato, ho rimosso la parte che è sbagliata. – thefourtheye

6

Ho la stessa sensazione che stai descrivendo. Una grande percentuale di variabili dichiarate nel mio codice tende ad essere costante, persino oggetti e matrici. È possibile dichiarare gli oggetti e gli array costanti e di essere ancora in grado di modificarli:

const arr = []; 
arr.push(1); 
arr; 
// [ 1 ] 

const obj = {}; 
obj.a = 1; 
obj; 
// { a: 1 } 

per quanto ne so ES6 modules non hanno bisogno di dichiarazioni di variabili durante l'importazione, e ho il sospetto che io.js will move to ES6 modules in a near future.

Penso che questa sia una scelta personale. Userei sempre const quando richiedo moduli e per variabili locali del modulo (foo nell'esempio). Per il resto delle variabili, usa const in modo appropriato, ma non impazzire mai e usa const ovunque. Non conosco le prestazioni tra let e const, quindi non posso dire se è meglio usare const quando è possibile.

+0

Perché non impazzire e usare 'const' dappertutto? Ho scoperto che raramente ho davvero bisogno di un 'let' (principalmente quando determino un valore in una clausola' if' o 'switch'). Non esiste uno svantaggio di usare 'const' dovunque sia possibile e il lato positivo di maggiori informazioni sulla variabile per il lettore. – Perseids

-2

LET V/S CONST

Differenza

  • La grande differenza tra affitto e const è che il tentativo di assegnare un precedentemente definito costante genera un errore sia stretta e modalità non rigide

Somiglianza

  • Simile a lasciare, viene generato un errore quando una dichiarazione const è realizzato con un identificatore per una variabile già definita nello stesso ambito.

Ad esempio:

var message = "Hello!"; 
let age = 25; 

// Each of these would cause an error given the previous declarations 
const message = "Goodbye!"; 
const age = 30; 
  • costanti anche a livello di blocco dichiarazioni, simile a lasciare. Ciò significa che le costanti vengono distrutte una volta che l'esecuzione esce dal blocco in cui sono state dichiarate e le dichiarazioni non vengono issate in cima al blocco.
2

Performance test const vs let utilizzo su require per Node.js 6.10:

require('do-you-even-bench')([ 
    { name: 'test 1', fn: function() { 
    const path = require('path'); 
    } 
    }, 
    { name: 'test 2', fn: function() { 
    let path = require('path'); 
    } 
    } 
]); 

prova 1 .... 2,547,746.72 op/s
test 2 .... 2,570,044.33 op/s

Problemi correlati