const

Оголошення const (стала) оголошує локальні змінні з блоковою областю видимості. Значення сталої не може бути змінено шляхом повторного присвоєння за допомогою оператора присвоєння, але якщо стала є об'єктом, то властивості такого об'єкта можуть бути додані, оновлені чи прибрані.

Спробуйте його в дії

Синтаксис

const name1 = value1;
const name1 = value1, name2 = value2;
const name1 = value1, name2 = value2, /* …, */ nameN = valueN;
nameN

Назва змінної до оголошення. Кожна назва повинна бути дозволеним ідентифікатором JavaScript або зв'язувальним патерном деструктурування.

valueN

Початкове значення змінної. Може бути будь-яким дозволеним виразом.

Опис

Оголошення const – вельми подібне до let:

  • Оголошення const мають області видимості блоків, як і функцій.

  • До оголошень const можна звертатися лише після того, як досягнуто місця оголошення (дивіться темпоральну мертву зону). У зв'язку з цим оголошення const часто звуть непіднімальними.

  • Оголошення const не створюють властивостей на globalThis, коли оголошення відбувається на зовнішньому рівні сценарію.

  • Оголошення const не можуть бути виконані повторно будь-яким іншим оголошенням в тій же області видимості.

  • З const починаються оголошення, але не інструкції. Це означає, що не можна використовувати самотнє оголошення const як тіло блоку (це має зміст, адже в такому разі не було б можливості звернутися до такої змінної).

    if (true) const a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
    

Ініціалізатор сталої – обов'язковий. Обов'язково задати значення в самому оголошенні. (Це має зміст, враховуючи те, що значення не можна змінити пізніше.)

const FOO; // SyntaxError: Missing initializer in const declaration

Оголошення const створює незмінюване посилання на значення. Це не означає, що значення, котре зберігається в сталій, незмінюване: це лише означає, що не може бути повторно присвоєний ідентифікатор змінної. Наприклад, у випадку, коли вміст є об'єктом, це означає, що вміст об'єкта (тобто його властивості) може бути змінений. Оголошення const слід розуміти як "створити змінну, чия ідентичність залишається сталою", а не "чиє значення залишається сталим", або "створити незмінювані зв'язування", а не "незмінювані значення".

Чимало стилістичних посібників (включно з тутешнім) радять віддавати перевагу const над let у випадках, коли змінна повторно не присвоюється у своїй області видимості. Це дозволяє чітко вказати, що тип змінної (або значення, у випадку примітивів) ніколи не змінюється. Інші можуть віддавати перевагу let для непримітивів, котрі змінюються.

Список, що стоїть після ключового слова const, зветься списком зв'язування і розділяється комами, причому коми не є операторами коми, а знаки = не є операторами присвоєння. Ініціалізатори пізніших змінних можуть посилатися на раніше оголошені змінні списку.

Приклади

Базове застосування const

Сталі можуть бути оголошені як у верхньому, так у нижньому регістрі, але загальноприйнято використовувати лише великі літери, особливо для примітивів, оскільки вони є істинно незмінюваними.

// означити MY_FAV як сталу і задати їй значення 7
const MY_FAV = 7;

console.log("моє улюблене число: " + MY_FAV);
// Повторне присвоєння сталій змінній спричиняє помилку
MY_FAV = 20; // TypeError: Assignment to constant variable

// Повторне оголошення сталої спричиняє помилку
const MY_FAV = 20; // SyntaxError: Identifier 'MY_FAV' has already been declared
var MY_FAV = 20; // SyntaxError: Identifier 'MY_FAV' has already been declared
let MY_FAV = 20; // SyntaxError: Identifier 'MY_FAV' has already been declared

Блокова область видимості

Важливо зауважити про природу блокової області видимості.

const MY_FAV = 7;

if (MY_FAV === 7) {
  // Це дозволено, оскільки знаходиться в новій блоковій області видимості
  const MY_FAV = 20;
  console.log(MY_FAV); // 20

  // оголошення var не обмежують область видимості блоками, тож це призводить до помилки
  var MY_FAV = 20; // SyntaxError: Identifier 'MY_FAV' has already been declared
}

console.log(MY_FAV); // 7

const для об'єктів і масивів

Оголошення const так само працює для об'єктів і масивів. Спроба перезаписати об'єкт призведе до помилки "Assignment to constant variable" (присвоєння сталій).

const MY_OBJECT = { key: "value" };
MY_OBJECT = { OTHER_KEY: "value" };

Проте ключі об'єктів – не захищені, тож наступна інструкція виконається без проблем:

MY_OBJECT.key = "otherValue";

Щоб об'єкт став беззмінним, треба використати на ньому Object.freeze().

Те саме стосується масивів. Присвоєння змінній нового масиву призводить до помилки "Assignment to constant variable".

const MY_ARRAY = [];
MY_ARRAY = ["B"];

І все ж, можна закинути в масив нові елементи, а отже – змінити його.

MY_ARRAY.push("A"); // ["A"]

Оголошення з деструктуруванням

Лівий бік кожного = також може бути зв'язувальним патерном. Це дає змогу створювати декілька змінних за раз.

const result = /(a+)(b+)(c+)/.exec("aaabcc");
const [, a, b, c] = result;
console.log(a, b, c); // "aaa" "b" "cc"

Більше про це – на сторінці Присвоєння з деструктуруванням.

Специфікації

Сумісність із браузерами

desktop mobile server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
const
Chrome Full support 21
Edge Full support 12
Firefox Full support 36
footnote
Internet Explorer Full support 11
Opera Full support 9
Safari Full support 5.1
WebView Android Full support 37
Chrome Android Full support 25
Firefox for Android Full support 36
footnote
Opera Android Full support 10.1
Safari on iOS Full support 6
Samsung Internet Full support 1.5
Deno Full support 1.0
Node.js Full support 6.0.0

Дивіться також