PorównaniePorównania

let vs const vs var

const i let mają zasięg blokowy, a var funkcyjny. const nie pozwala na ponowne przypisanie. W nowym kodzie pisz const, a let tylko dla zmieniających się wartości.

Na tej stronie

Porównanie w tabeli

#
  • Zasięg

    const
    Blokowy
    let
    Blokowy
    var
    Funkcyjny
  • Ponowne przypisanie

    let
    Tak
    var
    Tak
  • Ponowna deklaracja w tym samym zasięgu

    const
    Nie, SyntaxError
    let
    Nie, SyntaxError
    var
    Tak, bez błędu
  • Odwołanie przed deklaracją

    const
    ReferenceError
    let
    ReferenceError
    var
    Wartość undefined
  • Wartość przy deklaracji

    const
    Wymagana
    let
    Opcjonalna
    var
    Opcjonalna
  • Zmienna w pętli z callbackiem

    const
    W for...of każda iteracja ma własną stałą
    let
    Każda iteracja ma własną zmienną
    var
    Jedna zmienna wspólna dla wszystkich iteracji
  • Kiedy używać

    const
    Domyślnie
    let
    Gdy wartość się zmienia
    var
    Tylko w starym kodzie

Przykład

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

if (level > 1) {
  var visible = 'var widać poza blokiem'
  let hidden = 'let istnieje tylko w bloku'
}

console.log(course, level)
console.log(visible)
console.log(typeof hidden)
Konsola
JavaScript 2
var widać poza blokiem
undefined

Definicja i zastosowanie

#

Wszystkie trzy słowa kluczowe deklarują zmienne, ale różnią się zasięgiem, możliwością ponownego przypisania i zachowaniem przed deklaracją. let i const weszły do języka w ES2015 i mają zasięg blokowy: istnieją tylko w nawiasach klamrowych, w których je zadeklarowano. var ma zasięg funkcji, więc wychodzi poza bloki if i pętle.

const nie pozwala przypisać zmiennej nowej wartości, ale nie zamraża obiektu: do tablicy zadeklarowanej przez const nadal dodasz element. let pozwala na ponowne przypisanie. Do miejsca deklaracji obie są w tzw. strefie martwej (temporal dead zone), więc odwołanie do nich wcześniej rzuca ReferenceError. Deklaracja var jest wynoszona na początek funkcji (hoisting) i do czasu przypisania ma wartość undefined.

Praktyczna zasada: domyślnie const, let tylko dla wartości, które naprawdę się zmieniają (liczniki, sumy w pętli), a var wcale. Spotkasz go w starszych projektach i w starych odpowiedziach na forach, więc warto rozumieć, czym się różni.

Składnia

#
Składnia
const name = value
let name = value
var name = value

Więcej przykładów

#
const nie zamraża tablicy
JavaScript
const skills = ['HTML']
skills.push('CSS')
console.log(skills)

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

Zmieniać możesz zawartość tablicy lub obiektu, ale nie samo przypisanie. Do zamrożenia obiektu służy Object.freeze().

Pętla z setTimeout: var kontra 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)
}
Konsola
var 3
var 3
var 3
let 0
let 1
let 2

Wszystkie funkcje z pierwszej pętli widzą tę samą zmienną i, która po pętli ma wartość 3. let tworzy nową zmienną w każdej iteracji.

Strefa martwa: let przed deklaracją
JavaScript
try {
  console.log(points)
  let points = 10
} catch (error) {
  console.log(error.name)
}

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

Dobre praktyki

#
  • Zacznij od const i zmień na let dopiero wtedy, gdy edytor lub linter zgłosi próbę ponownego przypisania.
  • Reguły ESLint prefer-const i no-var pilnują tej zasady w całym projekcie.
  • Zasięg blokowy let i const dotyczy każdego bloku: if, pętli, try i samodzielnych nawiasów klamrowych.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.