В редакции 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";