const

Значение констант не может быть изменено новым присваиванием, а также не может быть переопределено. Константы (const) подчиняются области видимости уровня блока, так же как переменные объявленные с использованием ключевого слова let.
 

Синтаксис

const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
nameN
Имя константы. Подчиняется тем же правилам, что и идентификаторы обычных переменных.
valueN
Значение константы. Может быть любым из тех типов, которые могут быть для переменных.

Описание

Данная синтаксическая конструкция создаёт новую константу, которая может быть как глобальной, так и локальной внутри функции, в которой она определена. Инициализация константы обязательна; необходимо указать значение одновременно с объявлением (смысл в том, что потом это значение изменить уже нельзя).

const создаёт константу (новую именованную ссылку на область памяти), доступную только для чтения. Это не означает, что указываемое значение неизменно, но это значит, что идентификатор не может быть переназначен. Например, если константа указывает на объект, то сам объект может быть изменён.

Все соображения по поводу временных мёртвых зон, которые применяются к let, также применимы к const.

Имена констант не могут совпадать с именами функций или переменных той же области видимости.

Примеры

Ниже описаны примеры, демонстрирующие поведение constПопробуйте их выполнить в простом JavaScript-редакторе.

// Примечание: Идентификаторы констант могут быть объявлены как в верхнем, 
// так и в нижнем регистре. Но правилом хорошего тона является использование 
// верхнего регистра.

// определим MY_FAV как константу и присвоим ей значение 7 
const MY_FAV = 7;

// данное присваивание выдаст ошибку
MY_FAV = 20;

// напечатает 7
console.log("my favorite number is: " + MY_FAV);

// попробуем переопределить константу, будет выкинуто исключение
const MY_FAV = 20;

// имя MY_FAV зарезервированно константой выше, данная операция 
// выкинет исключение
var 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);

// Выдаст ошибку, потому что константа не инициализирована
const FOO; 

// const также работает с объектами
const MY_OBJECT = {"key": "value"};

// Попытка переопределить ссылку на объект вызовет исключение
MY_OBJECT = {"OTHER_KEY": "value"};

// но, свойства объекта (ключи) можно изменять
MY_OBJECT.key = "otherValue"; // Используйте Object.freeze() для того, чтобы сделать объект неизменяемым

// То же самое применимо к массивам
const MY_ARRAY = [];
// Например, можно добавлять элементы в массив
MY_ARRAY.push("A"); // ["A"]
// Но менять ссылку на объект массива нельзя. Это вызовет исключение.
MY_ARRAY = ["B"]

Спецификация

Спецификация Статус Комментарий
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Let and Const Declarations' в этой спецификации.
Стандарт Первоначальное определение
ECMAScript 2017 Draft (ECMA-262)
Определение 'Let and Const Declarations' в этой спецификации.
Черновик Нет изменений

Поддержка браузерами

Возможность Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка 21 (Да) 36 (36) 11 12 5.1
Переприсваивание выдаёт ошибку 20 (Да) 13 (13) 11 ? 10.0
Доступно в "грязном режиме" 49.0 ? ? ? ? ?
Возможность Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Базовая поддержка Нет (Да) ? ? (Да) ? (Да)
Переприсваивание выдаёт ошибку Нет (Да) ? ? (Да) 10.0 (Да)
Доступно в "грязном режиме" Нет 49.0 ? ? ? ? 49.0

Замечания о совместимости

В ранних версиях Firefox, Chrome, в Safari 5.1.7 , Opera 12.00 если вы определяете значение через const, то в этих браузерах вы всё ещё можете изменить это значение позже. Также всё это не поддерживается в Internet Explorer 6-10, но включено в Internet Explorer 11.

Замечания относительно Firefox

  • До SpiderMonkey 46 (Firefox 46 / Thunderbird 46 / SeaMonkey 2.43), при повторном объвлении вызывалась ошибка TypeError вместо SyntaxError (баг 1198833).
  • Начиная с SpiderMonkey 36 (Firefox 36 / Thunderbird 36 / SeaMonkey 2.33):
    • {const a=1};a выдаёт ReferenceError и не возвращает 1 из-за блочной области видимости.
    • const a; выдаёт SyntaxError ("missing = in const declaration"): требуется инициализация.
    • const a = 1; a = 2; выдаёт SyntaxError ("invalid assignment to const a"): ошибочное присваивание константе.

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: torbasow, pk.prog, WispProxy, Grumvol, xfg, gibson, crvst, SphinxKnight, KiraAndMaxim
 Обновлялась последний раз: torbasow,