const
The const declaration declares block-scoped local variables. The value of a constant can’t be changed through reassignment using the assignment operator, but if a constant is an object, its properties can be added, updated, or removed.
Try it
Syntax
const name1 = value1; const name1 = value1, name2 = value2; const name1 = value1, name2 = value2, /* …, */ nameN = valueN;
The name of the variable to declare. Each must be a legal JavaScript identifier or a destructuring binding pattern.
Initial value of the variable. It can be any legal expression.
Description
The const declaration is very similar to let :
- const declarations are scoped to blocks as well as functions.
- const declarations can only be accessed after the place of declaration is reached (see temporal dead zone). For this reason, const declarations are commonly regarded as non-hoisted.
- const declarations do not create properties on globalThis when declared at the top level of a script.
- const declarations cannot be redeclared by any other declaration in the same scope.
- const begins declarations, not statements. That means you cannot use a lone const declaration as the body of a block (which makes sense, since there’s no way to access the variable).
if (true) const a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
An initializer for a constant is required. You must specify its value in the same declaration. (This makes sense, given that it can’t be changed later.)
const FOO; // SyntaxError: Missing initializer in const declaration
The const declaration creates an immutable reference to a value. It does not mean the value it holds is immutable — just that the variable identifier cannot be reassigned. For instance, in the case where the content is an object, this means the object’s contents (e.g., its properties) can be altered. You should understand const declarations as «create a variable whose identity remains constant», not «whose value remains constant» — or, «create immutable bindings», not «immutable values».
Many style guides (including MDN’s) recommend using const over let whenever a variable is not reassigned in its scope. This makes the intent clear that a variable’s type (or value, in the case of a primitive) can never change. Others may prefer let for non-primitives that are mutated.
The list that follows the const keyword is called a binding list and is separated by commas, where the commas are not comma operators and the = signs are not assignment operators. Initializers of later variables can refer to earlier variables in the list.
Examples
Basic const usage
Constants can be declared with uppercase or lowercase, but a common convention is to use all-uppercase letters, especially for primitives because they are truly immutable.
// define MY_FAV as a constant and give it the value 7 const MY_FAV = 7; console.log("my favorite number is: " + MY_FAV);
// Re-assigning to a constant variable throws an error MY_FAV = 20; // TypeError: Assignment to constant variable // Redeclaring a constant throws an error 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
Block scoping
It’s important to note the nature of block scoping.
const MY_FAV = 7; if (MY_FAV === 7) // This is fine because it's in a new block scope const MY_FAV = 20; console.log(MY_FAV); // 20 // var declarations are not scoped to blocks so this throws an error var MY_FAV = 20; // SyntaxError: Identifier 'MY_FAV' has already been declared > console.log(MY_FAV); // 7
const in objects and arrays
const also works on objects and arrays. Attempting to overwrite the object throws an error «Assignment to constant variable».
const MY_OBJECT = key: "value" >; MY_OBJECT = OTHER_KEY: "value" >;
However, object keys are not protected, so the following statement is executed without problem.
MY_OBJECT.key = "otherValue";
You would need to use Object.freeze() to make an object immutable.
The same applies to arrays. Assigning a new array to the variable throws an error «Assignment to constant variable».
const MY_ARRAY = []; MY_ARRAY = ["B"];
Still, it’s possible to push items into the array and thus mutate it.
MY_ARRAY.push("A"); // ["A"]
Declaration with destructuring
The left-hand side of each = can also be a binding pattern. This allows creating multiple variables at once.
const result = /(a+)(b+)(c+)/.exec("aaabcc"); const [, a, b, c] = result; console.log(a, b, c); // "aaa" "b" "cc"
Specifications
| Specification |
|---|
| ECMAScript Language Specification # sec-let-and-const-declarations |
Browser compatibility
BCD tables only load in the browser
See also
- var
- let
- Constants in the JavaScript Guide
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on Sep 12, 2023 by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.
const
Создаём переменную, значение которой нельзя изменить.
Время чтения: меньше 5 мин
Открыть/закрыть навигацию по статье
- Кратко
- Пример
- Как понять
- Зачем нужны константы?
- Николай Лопин советует
- В чём разница между null, undefined и объявленной переменной без начального значения? (let foo;)
Контрибьюторы:
Обновлено 11 сентября 2022
Кратко
Скопировать ссылку «Кратко» Скопировано
const — ключевое слово языка для объявления констант. Константа — переменная, значение которой нельзя переназначить.
Пример
Скопировать ссылку «Пример» Скопировано
const DAYS_IN_YEAR = 365const DAYS_IN_YEAR = 365Как понять
Скопировать ссылку «Как понять» Скопировано
Константы — те же переменные. Единственная разница в том, что их нельзя переопределить.
Если попробовать это сделать, то код упадёт с ошибкой TypeError : invalid assignment to const :
const DAYS_IN_YEAR = 365 console.log(DAYS_IN_YEAR) DAYS_IN_YEAR = 600// ошибка, константы нельзя переопределятьconst DAYS_IN_YEAR = 365 console.log(DAYS_IN_YEAR) DAYS_IN_YEAR = 600 // ошибка, константы нельзя переопределять☝️ Если константа хранит массив или объект, то сам массив/объект изменять можно! Нельзя заменить один объект на другой. Это происходит из-за того, что константа хранит ссылку на сложное значение, а не само значение.
Например, мы можем добавить новый объект в массив, но при попытке записать в переменную series пустой массив произойдёт ошибка:
const series = ['Доктор Хаус', 'Клиника', 'Чёрное зеркало']series.push('Молодой папа')series = [] // ♂️ не можем _заменить_ один массив на другойconst series = ['Доктор Хаус', 'Клиника', 'Чёрное зеркало'] series.push('Молодой папа') series = [] // ♂️ не можем _заменить_ один массив на другойТа же история с объектами:
const person = person.age = 0person = < name: 'Педро' >// ♀️ не можем заменить на новый объектconst person = name: 'X Æ A-12', lastName: 'Musk' > person.age = 0 person = name: 'Педро' > // ♀️ не можем заменить на новый объектЗачем нужны константы?
Скопировать ссылку «Зачем нужны константы?» Скопировано
Константы защищают код от случайной перезаписи важных значений.
Применяют константы в двух случаях:
- мы хотим объявить переменную, которая хранит фундаментальное значение для программы. Например, количество дней в году, минимальную сумму заказа, форматы дат и так далее.
- мы объявляем переменную и устанавливаем ей значение всего один раз.
Как пишется
Скопировать ссылку «Как пишется» Скопировано
Константы объявляются так же, как и переменные:
const name = valueconst name = valuename Имя константы. Может использоваться любой допустимый идентификатор.
value Значение константы. Любое допустимое выражение.
На практике
Скопировать ссылку «На практике» Скопировано
Николай Лопин советует
Скопировать ссылку «Николай Лопин советует» Скопировано
Константы в современном JS используют чаще, чем переменные. В большинстве случаев, значение переменной устанавливается только один раз. Хорошей практикой считается объявлять такие переменные через const и писать название переменной в camelCase, чтобы подчеркнуть этот факт:
for (let i = 0; i < users.length; ++i) const user = users[i] printUserInfo(user)>for (let i = 0; i users.length; ++i) const user = users[i] printUserInfo(user) >Используй ALL _ CAPS формат именования, если нужно объявить константу, которая хранит важное значение для программы: количество элементов на странице по умолчанию, формат даты, максимальное количество заказов и т.д.
const ITEMS_PER_PAGE = 25 for (let i = 0; i < products.length && i < ITEMS_PER_PAGE; i++) printItem(products[i])>const ITEMS_PER_PAGE = 25 for (let i = 0; i products.length && i ITEMS_PER_PAGE; i++) printItem(products[i]) >+ Развернуть
На собеседовании
Скопировать ссылку «На собеседовании» Скопировано
В чём разница между null , undefined и объявленной переменной без начального значения? ( let foo; )
Скопировать ссылку «В чём разница между null, undefined и объявленной переменной без начального значения? (let foo;)» Скопировано
Скопировать ссылку «Александр Рассудихин отвечает» Скопировано
null обычно задаётся переменной явно и означает, что она ничего не содержит. undefined показывает, что значение переменной «не определено». undefined обычно присваивается переменной, когда она была объявлена, но не было определено её начальное значение. Также, undefined может возвращаться и из функции — это происходит, если функции явно не возвращает ничего другого. null же обычно возвращают из функции явно, чтобы показать, что результат функции равен «ничему».
Без начального значения можно оставлять только переменную объявленную через let или var . Если объявить переменную через const и не задать ей начального значения, будет ошибка: Uncaught SyntaxError : Missing initializer in const declaration .
Оператор typeof для null работает странно. typeof ( null ) выдаст нам строку ‘object’. Это официально признанная ошибка в языке, сохраняемая для совместимости. Ошибка тут в том, что null это отдельный тип данных, а не объект. С undefined всё куда лучше и typeof ( undefined ) выдаст нам ‘undefined’. Почитать ещё о typeof можно здесь.
Поговорим немного о приведении типов. Для начала, пример:
console.log(null + null); // 0console.log(undefined + undefined); // NaNconsole.log(null + null); // 0 console.log(undefined + undefined); // NaNnull во время сложения приводится к нулю. Это логично, так как числовым значением «ничего» является как раз 0.
С undefined другое поведении, так как JavaScript пытается привести его к числу, но у него не получается и в результате мы получаем NaN .Немного упомяну и про оператор нулевого слияния ( ? ? ). В выражении между двумя операндами, он будет возвращать первый операнд, если он не равен null или undefined . Можно сказать, что ? ? приравнивает смысл undefined и null к «ничего не содержит» и в этом случае, кладёт в переменную значение второго операнда.
JavaScript: Константы
Во всем модуле подавляющее большинство примеров кода использовало переменные в качестве имен (псевдонимы) конкретных значений, а не как переменные, которые меняют свое значение со временем.
let dollarsInEuro = 1.25; let rublesInDollar = 60; let dollarsCount = 50 * dollarsInEuro; // 62.5 let rublesCount = dollarsCount * rublesInDollar; // 3750 console.log(rublesCount);В программировании принято называть такие имена константами, и многие языки поддерживают константы как конструкцию. JavaScript, как раз, относится к таким языкам, и его стандарты кодирования говорят прямо — если значение не меняется, то мы имеем дело с константой. Перепишем пример выше на использование констант:
const dollarsInEuro = 1.25; const rublesInDollar = 60; const euros = 1000; const dollars = euros * dollarsInEuro; // 1250 const rubles = dollars * rublesInDollar; // 75000 console.log(rubles);Единственное изменение заключается в том, что ключевое слово let заменилось на const , но это только синтаксис. Теперь, если попытаться изменить любую константу, то мы получим сообщение об ошибке. В остальном они используются точно так же, как и переменные.
const pi = 3.14; pi = 5; // TypeError: Assignment to constant variable.Зачем такие сложности? Почему бы не оставить только переменные? Даже если бы мы оставили только переменные, то это не отменяет того факта, что они часто использовались бы как константы, более того, код на JavaScript можно и идиоматично писать без использования переменных вообще. Посмотрите на пример из реального кода Хекслета. На текущем этапе вы его вряд ли поймете, но попробуйте посчитать количество констант и переменных внутри него, вы увидите, что здесь ровно одна переменная, и целая куча констант.
Константы значительно проще для анализа, когда мы видим константу в коде, то нам сразу понятно, что ее значение всегда остается прежним. При использовании констант отсутствует понятие времени. С переменными все не так, мы не можем быть уверены в их значении, приходится анализировать весь код, чтобы понять, как они могли измениться.
Переменные жизненно необходимы только в одном случае (во всех остальных гарантировано можно обойтись без них) — при работе с циклами, до которых мы ещё дойдем.
В дальнейшем мы будем предпочитать константы и использовать переменные только тогда, когда без них никак.
Задание
Создайте константу army , присвойте ей значение the white walkers и распечатайте её значение на экран.
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
В чем различия var, let, const для объекта window?
Вроде бы много читал про var, let, const , в чем различия я вроде понимал, но не тут то было. Но обнаружил, что для глобального объекта window let и const не объявлены.
var varName = 'varName'; const constName = 'constName'; let letName = 'letName'; console.log('varName ', window.varName); console.log('constName ', window.constName); console.log('letName ', window.letName);с чего вдруг такое поведение? Как я понимаю, все три переменные в области видимости объекта window Вот пример в котором я столкнулся с проблемой, получается, что var важен и нужен и не умер в этом все работает
var name = 'windowViniamin'; function hello() < console.log('hello', this.name); >const person = < name: 'Viniamin', sayHello: hello >person.sayHello(); hello();а в этом нет (вместо этого 10dbb4dd-bf80-4d80-8ee2-a6a4954a029d должно быть пусто, у меня в браузере так)
const name = 'windowViniamin'; function hello() < console.log('hello', this.name); >const person = < name: 'Viniamin', sayHello: hello >person.sayHello(); hello();Отслеживать
задан 9 июл 2021 в 20:30
user322246 user322246
ответ есть stackoverflow.com/a/28776236/6104996 но надо перевести))
9 июл 2021 в 20:41Они и не должны попадать в свойства глобального объекта, по определению. Перед тем как задать вопрос, ты не читал статьи на MDN о let и const ? «Директива let объявляет переменную с блочной областью видимости . », «Константы (const) подчиняются области видимости уровня блока так же, как переменные, объявленные с использованием ключевого слова let.»
9 июл 2021 в 21:20
@yar85, директива let объявляет переменную с блочной областью видимости — в вопросе речь про глобальную область, формально там все три переменных в одной области
9 июл 2021 в 21:42
@Grundy, а, действительно. верное замечание.
9 июл 2021 в 21:461 ответ 1
Сортировка: Сброс на вариант по умолчанию
Глобальный environment record логически это один environment record, однако, включающий в себя declarative environment record и object environment record. При этом object environment record в качестве базового объекта использует глобальный объект.
Object environment record входящий в глобальный environment record содержит в себе все привязки встроенных глобальных значений. А так же привязки добавленный с помощью FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, или VariableStatement содержащихся в глобальном коде. Привязки для всех остальных ECMAScript определений, описанных в глобальном коде, добавляются в declarative environment record входящий в глобальный environment record.- declarative environment record хранит привязки во встроенной структуре данных. К этой структуре невозможно обратиться напрямую.
- object environment record в качестве структуры данных использует обычный javascript объект. Каждое свойство в этом объекте соответствует привязке и наоборот. В глобальном environment все привязывается к глобальному объекту.
Как указано в цитате выше, только FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, или VariableStatement добавляются в object environment record, т.е. только такие привязки становятся свойствами глобального объекта.
Все остальные объявления (let или const) добавляются в declarative environment record, который не связан с глобальным объектом.
