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 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
const
|
Chrome Full support 21 | Edge Full support 12 | Firefox Full support 36 | 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 | 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 |