Ключевое слово const

В редакции ES2015 были добавлены два новых важных ключевых слова JavaScript — let и const.

Переменные, декларированные при помощи ключевого слова const, ведут себя так же как переменные, декларированные при помощи ключевого слова let, за исключением того, что им нельзя переприсваивать значения:


const PI = 3.141592653589793;
PI = 3.14;      // Приведет к ошибке
PI = PI + 10;   // Тоже приведет к ошибке

Область видимости внутри блока

Относительно области видимости внутри блока поведение переменных, декларированных при помощи ключевого слова const, похоже на поведение переменных, декларированных при помощи ключевого слова let.

В следующем примере переменная x, декларированная внутри блока, не то же самое, что переменная x, декларированная вне этого блока:


var x = 10;
// здесь x равна 10
{ 
  const x = 2;
   // здесь x равна 2
}
// здесь x равна 10

Подробнее об области видимости внутри блока см. главу Ключевое слово let.

Присваивание во время декларации

Значения для JavaScript переменных с ключевым словом const должны присваиваться во время декларации:


// Не правильно
const PI;
PI = 3.14159265359;

// Правильно
const PI = 3.14159265359;

Не настоящие константы

Ключевое слово const может вводить в заблуждение.

В действительности оно определяет не константное значение, а константную ссылку на значение.

В связи с этим мы не можем изменять примитивные константные значения, но можем изменять свойства константных объектов.

Примитивные значения

Если мы присваиваем константе примитивное значение, то впоследствии мы не можем его изменить:


const PI = 3.141592653589793;
PI = 3.14;      // Приведет к ошибке
PI = PI + 10;   // Тоже приведет к ошибке

Константные объекты можно изменять

Свойства константных объектов можно изменять:


// Вы можете создать константный объект
const car = {type:"Fiat", model:"500", color:"white"};

// Вы можете изменить значение его свойства
car.color = "red";

// Вы можете добавить новое свойство
car.owner = "Johnson"; 

Но вы НЕ МОЖЕТЕ присвоить константному объекту новое значение:


const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"};    // ОШИБКА

Константные массивы можно изменять

Элементы константного массива можно изменять:


// Вы можете создать константный массив
const cars = ["Saab", "Volvo", "BMW"];

// Вы можете изменить значение его элемента
cars[0] = "Toyota";

// Вы можете добавить элемент
cars.push("Audi");

Но вы НЕ МОЖЕТЕ переприсвоить константный массив:


const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"];    // ОШИБКА

Передекларирование

Передекларировать переменную JavaScript при помощи ключевого слова var можно в любом месте программы:


var x = 2;    //  Можно
var x = 3;    //  Можно
x = 4;        //  Можно

Нельзя передекларировать или переприсвоить существующую переменную, декларированную при помощи ключевого слова var или let, с ключевым словом const в той же области видимости или в том же блоке:


var x = 2;         // Можно
const x = 2;       // Нельзя
{
  let x = 2;     // Можно
  const x = 2;   // Нельзя
}

Нельзя передекларировать или переприсвоить существующую переменную, декларированную при помощи ключевого слова const, в той же области видимости или в том же блоке:


const x = 2;       // Можно
const x = 3;       // Нельзя
x = 3;             // Нельзя
var x = 3;         // Нельзя
let x = 3;         // Нельзя

{
  const x = 2;   // Можно
  const x = 3;   // Нельзя
  x = 3;         // Нельзя
  var x = 3;     // Нельзя
  let x = 3;     // Нельзя
}

Передекларировать переменную с ключевым словом const в другой области видимости или в другом блоке можно:


const x = 2;     // Можно

{
  const x = 3;   // Можно
}

{
  const x = 4;   // Можно
} 

Поднятие

Переменные, декларированные при помощи ключевого слова var, "поднимаются" в верх JavaScript кода (если вы не знаете, что такое "поднятие" в JavaScript, то см. главу Поднятие переменных в Javascript).

Таким образом, мы можем использовать такие переменные до того, как они будут декларированы:


// здесь МОЖНО использовать carName
var carName; 

Переменные, декларированные при помощи ключевого слова const, не "поднимаются" в верх JavaScript кода.

Такие переменные нельзя использовать до тех пор, пока они не будут декларированы:


carName = "Volvo";   // здесь НЕЛЬЗЯ использовать carName
const carName = "Volvo";