I know that ES6 is not standardized yet, but a lot of browsers currently support const
keyword in JS.
In spec, it is written that:
The value of a constant cannot change through re-assignment, and a
constant cannot be re-declared. Because of this, although it is
possible to declare a constant without initializing it, it would be
useless to do so.
and when I do something like this:
const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];
I see that everything is ok: xxx
is still 6
and yyy
is []
.
But if I do yyy.push(6); yyy.push(1);
, my constant array has been changed. Right now it is [6, 1]
and by the way I still can not change it with yyy = 1;
.
Is this a bug, or am I missing something? I tried it in the latest chrome and FF29
TechWisdom
3,6704 gold badges34 silver badges40 bronze badges
asked May 2, 2014 at 20:30
Salvador DaliSalvador Dali
209k145 gold badges690 silver badges749 bronze badges
2
The documentation states:
…constant cannot change through re-assignment
…constant cannot be re-declared
When you’re adding to an array or object you’re not re-assigning or re-declaring the constant, it’s already declared and assigned, you’re just adding to the «list» that the constant points to.
So this works fine:
const x = {};
x.foo = 'bar';
console.log(x); // {foo : 'bar'}
x.foo = 'bar2';
console.log(x); // {foo : 'bar2'}
and this:
const y = [];
y.push('foo');
console.log(y); // ['foo']
y.unshift("foo2");
console.log(y); // ['foo2', 'foo']
y.pop();
console.log(y); // ['foo2']
but neither of these:
const x = {};
x = {foo: 'bar'}; // error - re-assigning
const y = ['foo'];
const y = ['bar']; // error - re-declaring
const foo = 'bar';
foo = 'bar2'; // error - can not re-assign
var foo = 'bar3'; // error - already declared
function foo() {}; // error - already declared
user1063287
10.1k23 gold badges116 silver badges212 bronze badges
answered May 2, 2014 at 20:38
6
This happens because your constant is actually storing a reference to the array. When you join something into your array you are not modifying your constant value, but the array it points to. The same would happen if you assigned an object to a constant and tried to modify any property of it.
If you want to freeze an array or object so it can’t be modified, you can use the Object.freeze
method, which is already part of ECMAScript 5.
const x = Object.freeze(['a'])
x.push('b')
console.log(x) // ["a"]
answered May 2, 2014 at 20:42
3
Came through this article while searching on why I was able to update an Object even after defining it as const
. So the point here is that it is not the Object directly but the attributes it contains which can be updated.
For example, my Object looks like:
const number = {
id:5,
name:'Bob'
};
The above answers correctly pointed out that it’s the Object which is const and not its attribute. Hence, I will be able to update the id or name by doing:
number.name = 'John';
But, I will not be able to update the Object itself like:
number = {
id:5,
name:'John'
};
TypeError: Assignment to constant variable.
answered Jun 17, 2019 at 17:15
Atul O HolicAtul O Holic
6,6224 gold badges39 silver badges74 bronze badges
1
This is consistent behavior with every programming language I can think of.
Consider C — arrays are just glorified pointers. A constant array only means that the value of the pointer will not change — but in fact the data contained at that address is free to.
In javascript, you are allowed to call methods of constant objects (of course — otherwise constant objects would not serve much purpose!) These methods might have the side effect of modifying the object. Since arrays in javascript are objects, this behavior applies to them as well.
All you are assured of is that the constant will always point to the same object. The properties of the object itself are free to change.
answered May 2, 2014 at 20:55
thorsdaythorsday
3161 silver badge5 bronze badges
2
I think this would give you more clarity on the issue : https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0 .
Basically it boils down to the const
always pointing to the same address in memory. You can change the value stored in that address but cannot change the address the const
is pointing too.
The definition of const
you mentioned will hold true when the const
is pointing to an address that holds a primitive value . This is because you cannot assign a value to this const
without changing its address (because this is how assigning primitive values work) and changing the address of a const
is not allowed.
Where as if the const
is pointing to non-primitive value , it is possible to edit the value of the address.
answered Aug 9, 2018 at 20:37
ZyxmnZyxmn
792 silver badges6 bronze badges
1
The keyword const is a little misleading.
It does not define a constant value. It defines a constant reference to a value.
Because of this you can NOT:
- Reassign a constant value
- Reassign a constant array
- Reassign a constant object
But you CAN:
- Change a constant array
- Change a constant object
answered Aug 1, 2021 at 9:56
ubair noorubair noor
611 silver badge1 bronze badge
2
The const declaration creates a read-only 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 parameters) can be altered.
In addition, an also important note:
Global constants do not become properties of the window object …
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
answered Apr 23, 2018 at 12:14
The value of a const can’t be changed through reassignment, and it can’t be redeclared.
const testData = { name:"Sandeep",lastName:"Mukherjee",company:"XYZ"}
First case
testData = {name:"hello"}
console.log(testData);//throws an Error:Assignment to constant variable
Here we are reassigning testData again
Second case
const testData = {name:"Sandeep",lastName:"Mukherjee",company:"ABC"}
console.log(testData); //throws an Error: Identifier 'testData' has already been declared
Here we are redeclaring testData again
When a variable is declared using const it means it points to some memory location the
behaviour of const is we can manipulate the value stored in that memory location but not
the memory location,when we reassign/redeclare the const variable it
does not allow to change the memory location
We can change the value of a specific key
testData.company = "Google"
console.log(testData);
//{ name: 'Sandeep', lastName: 'Mukherjee', company: 'Google' }
We can add any new key value pair to it
testData.homeTown = "NewYork"
console.log(testData)
//{name: 'Sandeep',lastName:'Mukherjee',company:'Google',homeTown: 'NewYork'}
answered Oct 30, 2021 at 8:20
Because in const you can change the values of an object, so the object does not actually store the assignment data but instead, it points to it.
so there is a difference between primitives and objects in Javascript.
answered Jan 16, 2020 at 12:58
const variable stores the address (memory address such as 0xFF2DFC) that is constant.
The constant is NOT the content at the memory.
constant is memory address ONLY
Thank you for reading.
answered Dec 26, 2020 at 3:35
const MY_OBJECT = {'key': 'value'};
// Attempting to overwrite the object throws an error
// Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {'OTHER_KEY': 'value'};
// However, object keys are not protected,
// so the following statement is executed without problem
MY_OBJECT.key = 'otherValue';
// Use Object.freeze() to make object immutable
// The same applies to arrays
const MY_ARRAY = [];
// It’s possible to push items into the array
MY_ARRAY.push('A');
// [«A»]
// However, assigning a new array to the variable throws an error
// Uncaught TypeError: Assignment to constant variable.
MY_ARRAY = ['B'];
answered Jun 27, 2021 at 17:58
In your constant is saved not the object, but link to the object.
You can’t change this link, because it is constant.
But object you can change.
answered Mar 27, 2022 at 10:35
Значение констант не может быть изменено новым присваиванием, а также не может быть переопределено. Константы (const
) подчиняются области видимости уровня блока так же, как переменные, объявленные с использованием ключевого слова let
.
Синтаксис
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
nameN
-
Имя константы. Подчиняется тем же правилам, что и идентификаторы обычных переменных.
valueN
-
Значение константы. Может быть любым из тех типов, которые могут быть для переменных, включая функцию.
Описание
Это объявление создаёт константу, чья область действия может быть как глобальной, так и локальной внутри блока, в котором она объявлена. Глобальные константы не становятся свойствами объекта window, в отличие от var
-переменных. Инициализация константы обязательна; необходимо указать значение одновременно с объявлением (смысл в том, что потом это значение изменить уже нельзя).
const
создаёт константу (новую именованную ссылку на область памяти), доступную только для чтения. Это не означает, что указываемое значение неизменно, но это означает, что идентификатор не может быть переназначен. Например, если константа указывает на объект, то сам объект может быть изменён.
Все соображения по поводу временных мёртвых зон, применимы и к let
и к const
.
Имена констант не могут совпадать с именами функций или переменных той же области видимости.
Примеры
Ниже описаны примеры, демонстрирующие поведение const
. Попробуйте их выполнить в простом JavaScript-редакторе или в консоли браузера.
// Примечание: Идентификаторы констант могут быть объявлены как в верхнем,
// так и в нижнем регистре. Но правилом хорошего тона является использование
// верхнего регистра.
// определим MY_FAV как константу и присвоим ей значение 7
const MY_FAV = 7;
// данное присваивание выдаст ошибку - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;
// напечатает 7
console.log("my favorite number is: " + MY_FAV);
// попробуем переопределить константу, будет брошено исключение - Uncaught SyntaxError: Identifier 'MY_FAV' has already been declared
const MY_FAV = 20;
// имя MY_FAV зарезервировано константой выше, данная операция
// выкинет исключение
var MY_FAV = 20;
// здесь также будет ошибка
let MY_FAV = 20;
// Важно отметить свойства области видимости уровня блока
if (MY_FAV === 7) {
// Всё нормально. Создать константу или переменную MY_FAV можно.
// (работает так же как и let при объявлении в блоке переменных, которые не const)
const MY_FAV = 20;
// MY_FAV теперь 20
console.log("my favorite number is " + MY_FAV);
// это попадёт в глобальный контекст и выдаст ошибку
var MY_FAV = 20;
}
// MY_FAV все ещё имеет значение 7
console.log("my favorite number is " + MY_FAV);
// Выдаст ошибку, потому что константа не инициализирована - Uncaught SyntaxError: Missing initializer in const declaration
const FOO;
// const также работает с объектами
const MY_OBJECT = {"key": "value"};
// Попытка переопределить ссылку на объект вызовет исключение - Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {"OTHER_KEY": "value"};
// но, свойства объекта (ключи) можно изменять
MY_OBJECT.key = "otherValue"; // Используйте Object.freeze() для того, чтобы сделать объект неизменяемым
// То же самое применимо к массивам
const MY_ARRAY = [];
// Например, можно добавлять элементы в массив
MY_ARRAY.push("A"); // ["A"]
// Но менять ссылку на объект массива нельзя. Это вызовет исключение - Uncaught TypeError: Assignment to constant variable
MY_ARRAY = ["B"]
Спецификация
Specification |
---|
ECMAScript Language Specification # sec-let-and-const-declarations |
Поддержка браузерами
BCD tables only load in the browser
Смотрите также
JavaScript const variable value change
As you known, Variable declare with const keyword you can not change later in program, but this condition is apply only for constant primitive values not for constant object or array.
Note : If you declare constant object or array value with const keyword, You can change or add the properties of const variables.
Let’s see the examples:
➤ Example 1 : constant primitive values;
-
If we assign a primitive value to a constant, we can't change the primitive value.
- <script>
-
const x = 25;//output : 25
-
x++; //ERROR, not allowed
-
x = 20; //ERROR, not allowed
-
x = x+5; //ERROR, not allowed
- </script>
# Let see how to change the value of const variable
➤ Example 2: constant objects values;
-
You can change the properties of a constant object.
- <script>
-
//You can create a const object.
-
const student = {name:"Ankaj", branch:"CS"};
-
//You can change a property.
-
student.name = "Ankaj Gupta"; //Allow
-
//You can add a property.
-
student.rollno = "45"; //Allow
-
//Note : But you can't re-assign a constant object.
-
student = {name:"Anmol", branch:"initialize"}; //ERROR, not allowed
- </script>
➤ Example 3 : constant array values;
-
You can change the elements of a constant array.
- <script>
-
//You can create a const array.
-
const student = ["Name", "Branch", "Rollno"];
-
//You can change an element.
-
student[2] = "Enroll_No"; //Allow
-
//You can add an element.
-
student.push("Gender"); //Allow
-
//Note : But you can't reassign a constant array.
-
student = ["Name", "Branch", "Enroll_No", "Gender"];//ERROR, not allowed
- </script>
Popular Posts
# Java program to print student details using «single-level» inheritance In this section, You will learn how to print student details using single inheritance in java, with Scanner and without Scanner class. 1.) With » Scanner » class Let’s try to create a simple example : ➤ Example : student.java; import java.util.Scanner; class StudentDetails { int roll_no ; String name , cl ; //creating a function to take student details void input () { Scanner sc = new Scanner ( System . in ); System . out . print ( «Ente
# Django static and media files not working when debug is false In this article you will learn how to fix problem of not loading static files and media in Django even the DEBUG is FALSE. This is the easiest and safest solution. # Problem: Django static and media files not working when debug is false ➤ Code: settings.py DEBUG = False #True ALLOWED_HOSTS = [ ‘*’ ] #Host name # Problem Fix: Let’s see, How you can fix the problem of Django static and media files not working when DEBUB = False : 1.)First way: devserver in insecure mode If you still need to server static locally ( e.g. for testing without debug ) you can run devserver in insecure mode: python manage.py runserver —insecure —insecure: it means you can run serve
# Django static files not working In this article, you will learn how to fix the problem of not loading static files. This is the easiest and safest solution. In the new version of Django 3.1 and above the settings.py file uses PATH instead of OS to deal with the directory structure. So all the code, we wrote for our static dirs and things like that will no longer work unless we import os at the top of our settings.py file.. Note : This article related to DEBUG = True , if you have problems with DEBUG = False then you can follow this article; Static files not working when DEGUB= False . Have fun! Let’s follow a few steps and, solve the problem of not loading Django static files: Step 1 : Check that «BASE_DIR» is defined in your project settings.py , if not then define it ➤ Code: settings.py import os BASE_DIR =
Every Javascript developer knows that var and let is reassignable but const cannot be reassigned or redeclared again.
But there is a little secret about const, let’s look at some code.
const val = 10; // 10
val = 15; // Uncaught TypeError: Assignment to constant variable
Enter fullscreen mode
Exit fullscreen mode
As expected, we are unable to reassign val to another number. How about string?
const str = 'I am a String'; // 'I am a String'
str = 'I am a Cheese Stringers now'; // Uncaught TypeError: Assignment to constant variable
Enter fullscreen mode
Exit fullscreen mode
Still no. How about the array and object?
// Array
const arrVariable = [10, 11, 12, 13]; // [10, 11, 12, 13]
arrVariable = [14, 15, 16]; // Uncaught TypeError: Assignment to constant variable
Enter fullscreen mode
Exit fullscreen mode
// Obj
const objVariable = {1: 10, 2: 20, 3: 30, 4: 40}; // {1: 10, 2: 20, 3: 30, 4: 40}
objVariable = {5: 50, 6: 60}; // Uncaught TypeError: Assignment to constant variable
Enter fullscreen mode
Exit fullscreen mode
Javascript: Nope nope nope you can’t do that nope…
But what if we do this:
const arrVariable = [10, 11, 12, 13]; // [10, 11, 12, 13]
arrVariable.push(14); // [10, 11, 12, 13, 14]
Enter fullscreen mode
Exit fullscreen mode
What?! Let’s continue and play around a bit…
arrVariable[0] = 'Eat'; // ['Eat', 11, 12, 13, 14]
arrVariable[1] = '🥑'; // ['Eat', '🥑', 12, 13, 14]
arrVariable[2] = {1: 'Avocado'}; // ['Eat', '🥑', {1: 'Avocado'}, 13, 14]
arrVariable[3] = true; // ['Eat', '🥑', {1: 'Avocado'}, true, 14]
Enter fullscreen mode
Exit fullscreen mode
OMG what just happened?
From MDN Web Docs, it describes:
The const declaration creates a read-only 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.
Who is the variable identifier/constant here? arrVariable, not the array itself.
MDN said variable identifier/constant cannot be reassigned, which means arrVariable cannot be reassigned. But what about the array? It doesn’t have any effect, of course, it is still mutable.
const tells the reader that your variable cannot be reassigned, which is why it is highly recommended to use. It prevents us to create some unnecessary bugs and improve code readability.
Similar to object:
const objVariable = {1: 10, 2: 20, 3: 30, 4: 40}; // {1: 10, 2: 20, 3: 30, 4: 40}
objVariable[1] = '🍕'; // {1: '🍕', 2: 20, 3: 30, 4: 40}
objVariable[2] = ['Pizza', 'is', 'life']; // {1: '🍕', 2: ['Pizza', 'is', 'life'], 3: 30, 4: 40}
objVariable[3] = true; // {1: '🍕', 2: ['Pizza', 'is', 'life'], 3: true, 4: 40}
objVariable[5] = {1: '🍺', 2: '🍔'} // {1: '🍕', 2: ['Pizza', 'is', 'life'], 3: true, 4: 40, 5: {1: '🍺', 2: '🍔'}
Enter fullscreen mode
Exit fullscreen mode
So next time if someone asks you about our friend const, you know what to say.
Lastly,
arrVariable = 'I am an 🥑'; // Uncaught TypeError: Assignment to constant variable
😑😑😑😑😑
Enter fullscreen mode
Exit fullscreen mode
Still nope, anyway…
const
Константы имеют блочную область видимости, как и переменные, объявленные с использованием ключевого слова let
. Значение константы нельзя изменить путем переназначения (т. е. с помощью оператора присваивания ) и нельзя повторно объявить (т. е. с помощью объявления переменной ). Однако, если константа является объектом или массивом, ее свойства или элементы могут быть обновлены или удалены.
Try it
Syntax
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
nameN
-
Имя константы, которое может быть любым допустимым идентификатором .
valueN
-
Значение константы. Это может быть любое допустимое выражение , включая выражение функции.
Синтаксис деструктурирующего присваивания также можно использовать для объявления переменных.
Description
Это объявление создает константу, область действия которой может быть глобальной или локальной по отношению к блоку, в котором она объявлена. Глобальные константы не становятся свойствами объекта window
, в отличие от переменных var
.
Инициализатор для константы обязателен.Вы должны указать ее значение в том же объявлении.(Это имеет смысл,учитывая,что его нельзя будет изменить позже).
Константа создает доступную только для чтения ссылку на значение const
Это не означает, что значение, которое она содержит, является неизменным — просто идентификатор переменной нельзя переназначить. Например, в случае, когда содержимое представляет собой объект, это означает, что содержимое объекта (например, его свойства) может быть изменено.
Все соображения о временной мертвой зоне применимы как к let
, так и к const
.
Константа не может разделять свое имя с функцией или переменной в одной области видимости.
В отличие от var
, const
начинается с объявлений , а не операторов . Это означает, что вы не можете использовать одиночное объявление const
в качестве тела блока (что имеет смысл, поскольку нет способа получить доступ к переменной).
Examples
Базовое использование const
Константы могут быть объявлены с прописной или строчной буквы,но общепринятой конвенцией является использование всех прописных букв.
const MY_FAV = 7; MY_FAV = 20; console.log('my favorite number is: ' + MY_FAV); const MY_FAV = 20; var MY_FAV = 20; let MY_FAV = 20;
Block scoping
Важно отметить природу блочной сортировки.
if (MY_FAV === 7) { let MY_FAV = 20; console.log('my favorite number is ' + MY_FAV); var MY_FAV = 20; } console.log('my favorite number is ' + MY_FAV);
const должна быть инициализирована
const в объектах и массивах
const
также работает с объектами и массивами. При попытке перезаписать объект выдает ошибку «Присвоение постоянной переменной».
const MY_OBJECT = { key: 'value' }; MY_OBJECT = { OTHER_KEY: 'value' };
Однако ключи объектов не защищены,поэтому следующий оператор выполняется без проблем.
MY_OBJECT.key = 'otherValue'
Вам нужно будет использовать Object.freeze()
, чтобы сделать объект неизменным.
То же самое относится и к массивам.Присвоение нового массива переменной приводит к ошибке «Присвоение константной переменной».
const MY_ARRAY = []; MY_ARRAY = ['B'];
Тем не менее,можно заталкивать элементы в массив и таким образом мутировать его.
MY_ARRAY.push('A'); // ["A"]
Specifications
Browser compatibility
Desktop | Mobile | Server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | Deno | Node.js | |
const |
21 |
12 |
36 [ «Перед Firefox 13, |
11 |
9 |
5.1 |
4.4 |
25 |
36 [ «Перед Firefox 13, |
10.1 |
6 |
1.5 |
1.0 |
6.0.0 |
See also
var
let
- Константы в руководстве по JavaScript
JavaScript
-
break
Прерывание завершает текущий цикл,переключатель или оператор метки и передает управление программой на следующий завершенный идентификатор,связанный с меткой
-
class
Объявление класса создает новый с заданным именем,используя наследование по прототипу.
-
continue
Continue завершает выполнение текущей итерации или маркированного цикла и продолжает выполнение следующего идентификатора,связанного с меткой оператора.
-
debugger
Отладчик вызывает любую доступную функциональность отладки,например,установку точки останова.