ComparaisonComparaisons

let vs const vs var

const et let ont une portée de bloc, var une portée de fonction, et const interdit la réaffectation. Écrivez const par défaut, let pour les valeurs qui changent.

Sur cette page

Comparaison point par point

#
  • Portée

    const
    Bloc
    let
    Bloc
    var
    Fonction
  • Réaffectation

    let
    Oui
    var
    Oui
  • Nouvelle déclaration dans la même portée

    const
    Non, SyntaxError
    let
    Non, SyntaxError
    var
    Oui, sans erreur
  • Référence avant la déclaration

    const
    ReferenceError
    let
    ReferenceError
    var
    Valeur undefined
  • Valeur à la déclaration

    const
    Obligatoire
    let
    Optionnelle
    var
    Optionnelle
  • Variable dans une boucle avec un callback

    const
    Dans for...of, chaque itération a sa propre constante
    let
    Chaque itération a sa propre variable
    var
    Une seule variable commune à toutes les itérations
  • Quand l’utiliser

    const
    Par défaut
    let
    Quand la valeur change
    var
    Seulement dans du vieux code

Exemple

#
JavaScript
const course = 'JavaScript'
let level = 1
level = level + 1

if (level > 1) {
  var visible = 'var est visible hors du bloc'
  let hidden = 'let existe seulement dans le bloc'
}

console.log(course, level)
console.log(visible)
console.log(typeof hidden)
Console
JavaScript 2
var est visible hors du bloc
undefined

Définition et utilisation

#

Les trois mots-clés déclarent des variables, mais ils diffèrent par leur portée, la possibilité de réaffectation et leur comportement avant la déclaration. let et const sont arrivés dans le langage avec ES2015 et ont une portée de bloc : ils n’existent que dans les accolades où ils ont été déclarés. var a une portée de fonction, donc il sort des blocs if et des boucles.

const n’autorise pas à affecter une nouvelle valeur à la variable, mais ne gèle pas l’objet : vous pouvez toujours ajouter un élément à un tableau déclaré avec const. let autorise la réaffectation. Jusqu’à l’endroit de leur déclaration, les deux sont dans ce qu’on appelle la zone morte temporelle (temporal dead zone), donc y faire référence avant lève une ReferenceError. La déclaration var est remontée (hoisting) au début de la fonction et vaut undefined jusqu’à l’affectation.

Règle pratique : const par défaut, let seulement pour les valeurs qui changent vraiment (compteurs, sommes dans une boucle), et var jamais. Vous le rencontrerez dans d’anciens projets et d’anciennes réponses sur les forums, donc il est utile de comprendre ce qui le distingue.

Syntaxe

#
Syntaxe
const name = value
let name = value
var name = value

Plus d’exemples

#
const ne gèle pas un tableau
JavaScript
const skills = ['HTML']
skills.push('CSS')
console.log(skills)

try {
  skills = []
} catch (error) {
  console.log(error.name)
}
Console
['HTML', 'CSS']
TypeError

Vous pouvez modifier le contenu d’un tableau ou d’un objet, mais pas l’affectation elle-même. Pour geler un objet, utilisez Object.freeze().

Boucle avec setTimeout : var contre let
JavaScript
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log('var', i), 0)
}

for (let j = 0; j < 3; j++) {
  setTimeout(() => console.log('let', j), 0)
}
Console
var 3
var 3
var 3
let 0
let 1
let 2

Toutes les fonctions de la première boucle voient la même variable i, qui vaut 3 après la boucle. let crée une nouvelle variable à chaque itération.

Zone morte temporelle : let avant la déclaration
JavaScript
try {
  console.log(points)
  let points = 10
} catch (error) {
  console.log(error.name)
}

console.log(bonus)
var bonus = 5
Console
ReferenceError
undefined

Bonnes pratiques

#
  • Commencez par const et passez à let seulement quand l’éditeur ou le linter signale une tentative de réaffectation.
  • Les règles ESLint prefer-const et no-var font respecter cette règle dans tout le projet.
  • La portée de bloc de let et const s’applique à chaque bloc : if, boucles, try et accolades autonomes.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.