Ключевое слово 'const' не делает значение неизменным. Что это значит?

Здесь определение const в разделе Изучение ES6 доктором Акселем Раушмайером:

const работает как let, но переменная, которую вы объявляете, должна быть немедленно инициализируется, со значением, которое не может быть изменено после. [...]

const bar = 123;
bar = 456;  // TypeError: `bar` is read-only

а затем он пишет

Pitfall: const не делает значение неизменным

const означает только, что переменная всегда имеет одно и то же значение, но это не означает, что само значение является или становится неизменным.

Я немного смущен этой ловушкой. Может ли кто-нибудь четко определить const с этой ловушкой?

Ответ 1

MDN подводит итог:

Объявление const создает ссылку на чтение только для значения. Это не означает, что значение, которое оно имеет, является неизменным, просто чтобы идентификатор переменной не мог быть переназначен. Например, если контент является объектом, это означает, что сам объект все еще может быть изменен.

Более кратко: const создает непреложную привязку.

Другими словами: const, подобно var, дает вам изменяемый кусок памяти, в котором вы что-то храните. Однако const требует, чтобы вы продолжали ссылаться на тот же блок памяти - вы не можете переназначить переменную на другой блок памяти, потому что ссылка на переменную постоянна.

Чтобы сделать что-то постоянное и неизменное после того, как вы его объявили, вам нужно использовать что-то вроде Object.freeze(). Однако это неглубоко и работает только с парами ключ/значение. Замораживание всего объекта требует немного больших усилий. Сделать это неоднократно исполнительным образом еще более сложно. Если вы действительно нуждаетесь в этом, я бы рекомендовал проверить что-то вроде Immutable.js

Ответ 2

Когда вы создаете что-то const в JavaScript, вы не можете переназначить эту переменную, чтобы ссылаться на что-то другое. Однако переменная все равно может ссылаться на изменяемый объект.

const x = {a: 123};

// This is not allowed.  This would reassign `x` itself to refer to a
// different object.
x = {b: 456};

// This, however, is allowed.  This would mutate the object `x` refers to,
// but `x` itself hasn't been reassigned to refer to something else.
x.a = 456;

В случае примитивов, таких как строки и числа, const проще понять, поскольку вы не мутируете значения, а вместо этого назначаете новое значение переменной.

Ответ 3

Пересвязывание

const и let объявления определяют, разрешены ли перезаписи (aka reassignments) между идентификаторами и значениями:

const x = "initial value";
let y = "initial value";

// rebinding/reassignment

try { x = "reassignment" } catch(e) { console.log(x) } // fails

y = "reassignment"; // succeeds
console.log(y);

Ответ 4

const означает: вы не можете изменить первоначально назначенное значение.

Сначала определите, что такое значение в js. Значение может быть: Булевы, строки, числа, объекты, функции и значения undefined.

Нравится: Люди зовут вас своим именем, оно не меняется. Однако вы меняете свою одежду. привязка между людьми и вами - ваше имя. Остальное может измениться. Извините за странный пример.

Итак, позвольте мне привести несколько примеров:

// boolean
const isItOn = true;
isItOn = false;           // error

// number
const counter = 0;
counter++;                // error

// string
const name = 'edison';
name = 'tesla';           // error

// objects
const fullname = {
  name: 'albert',
  lastname: 'einstein'
};

fullname = {              // error
  name: 'werner',
  lastname: 'heisenberg'
};
// NOW LOOK AT THIS:
//
// works because, you didn't change the "value" of fullname
// you changed the value inside of it!
fullname.name = 'hermann';

const increase = aNumber => ++aNumber;
increase = aNumber => aNumber + 1;      // error

// NOW LOOK AT THIS:
//
// no error because now you're not changing the value
// which is the decrease function itself. function is a
// value too.
let anotherNumber = 3;
const decrease = () => --anotherNumber;

anotherNumber = 10;             // no error
decrease();                     // outputs 9

const chaos = undefined;
chaos = 'let there be light'    // error

const weird = NaN;
weird = 0                       // error

Как вы можете видеть, если вы не изменяете присваиваемое значение "первым" для константы, нет ошибки. Всякий раз, когда вы пытаетесь изменить первое присваиваемое значение на что-то другое, он становится сердитым и дает ошибку.

Итак, это второе, что вы можете знать при использовании const. Которая, , должна быть инициализирована значением в ее объявлении или будет сердиться.

const orphan;                    // error
const rich = 0;                  // no error

Ответ 5

ES6/ES2015 const ключевое слово:

Ключевое слово const используется для объявления переменной диапазона (например, объявления с let). Разница между объявлением переменной с const и let заключается в следующем:

  1. Переменная, объявленная const не может быть переназначена.
  2. Переменная, объявленная с const, должна быть назначена при объявлении. Это является логическим следствием предыдущей точки, потому что переменную, объявленную с const нельзя переназначить, поэтому мы должны назначить ее ровно один раз, когда объявим переменную.

Пример:

// we declare variable myVariable
let myVariable;

// first assignment
myVariable = 'First assingment';
// additional assignment
myVariable = 'Second assignment';

// we have to declare AND initialize the variable at the same time
const myConstant = 3.14;

// This will throw an error
myConstant = 12;