Как изменить const js

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

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's user avatar

TechWisdom

3,6704 gold badges34 silver badges40 bronze badges

asked May 2, 2014 at 20:30

Salvador Dali's user avatar

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's user avatar

user1063287

10.1k23 gold badges116 silver badges212 bronze badges

answered May 2, 2014 at 20:38

adeneo's user avatar

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

Guilherme Sehn's user avatar

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 Holic's user avatar

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

thorsday's user avatar

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

Zyxmn's user avatar

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 noor's user avatar

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

Benjamin West's user avatar

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

Sandeep Mukherjee's user avatar

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

Thanh Do's user avatar

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

Mohammad Ali Shuvo's user avatar

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

Victoria's user avatar

Значение констант не может быть изменено новым присваиванием, а также не может быть переопределено. Константы (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.

  1. <script>
  2. const x = 25;//output : 25

  3. x++; //ERROR, not allowed

  4. x = 20; //ERROR, not allowed

  5. x = x+5; //ERROR, not allowed

  6. </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.

  1. <script>
  2. //You can create a const object.

  3. const student = {name:"Ankaj", branch:"CS"};

  4. //You can change a property.

  5. student.name = "Ankaj Gupta"; //Allow

  6. //You can add a property.

  7. student.rollno = "45"; //Allow

  8. //Note : But you can't re-assign a constant object.

  9. student = {name:"Anmol", branch:"initialize"}; //ERROR, not allowed

  10. </script>

 ➤ Example 3 : constant array values;

  • You can change the elements of a constant array.

  1. <script>
  2. //You can create a const array.

  3. const student = ["Name", "Branch", "Rollno"];

  4. //You can change an element.

  5. student[2] = "Enroll_No"; //Allow

  6. //You can add an element.

  7. student.push("Gender"); //Allow

  8. //Note : But you can't reassign a constant array.

  9. student = ["Name", "Branch", "Enroll_No", "Gender"];//ERROR, not allowed

  10. </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 =

Sheary Tan

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, const реализуется, но повторное назначение не удается.», «Перед тем как Firefox 46, TypeError был выброшен на переопределение вместо SyntaxError .»]

11

9

5.1

4.4

25

36

[ «Перед Firefox 13, const реализуется, но повторное назначение не удается.», «Перед тем как Firefox 46, TypeError был выброшен на переопределение вместо SyntaxError .»]

10.1

6

1.5

1.0

6.0.0

See also

  • var
  • let
  • Константы в руководстве по JavaScript


JavaScript

  • break

    Прерывание завершает текущий цикл,переключатель или оператор метки и передает управление программой на следующий завершенный идентификатор,связанный с меткой

  • class

    Объявление класса создает новый с заданным именем,используя наследование по прототипу.

  • continue

    Continue завершает выполнение текущей итерации или маркированного цикла и продолжает выполнение следующего идентификатора,связанного с меткой оператора.

  • debugger

    Отладчик вызывает любую доступную функциональность отладки,например,установку точки останова.

Понравилась статья? Поделить с друзьями:
  • Как изменить comp id
  • Как изменить commit message git
  • Как изменить com1 на com3
  • Как изменить com порт устройства windows 10
  • Как изменить com порт usb на виндовс 10