Const в JavaScript? Когда его использовать и нужно ли это

Я недавно сталкивался с ключевым словом const в javascript. Из того, что я могу сказать, он используется для создания неизменяемых переменных, и я проверил, чтобы убедиться, что он не может быть переопределен (в node.js):

const x = 'const';
const x = 'not-const';

// Will give an error: 'constant 'x' has already been defined'

Я понимаю, что он еще не стандартизирован во всех браузерах - но меня интересует только контекст node.js/v8, и я заметил, что некоторые разработчики / проекты, похоже, сильно его поддерживают, когда можно использовать ключевое слово var к тому же эффекту.

Вопросы?

Когда целесообразно использовать const вместо var?

Должен ли он использоваться каждый раз, когда объявляется переменная, которая не будет переназначена?

Имеет ли это какое-то значение, если var используется вместо const или наоборот?

15 ответов

Решение

Есть два аспекта ваших вопросов: каковы технические аспекты использования const вместо var и каковы человеческие аспекты этого.

Техническая разница значительна. В скомпилированных языках константа будет заменена во время компиляции, и ее использование позволит проводить другие оптимизации, такие как удаление мертвого кода, для дальнейшего повышения эффективности кода во время выполнения. Последние (свободно используемые термины) движки JavaScript на самом деле компилируют код JS для повышения производительности, поэтому использование ключевого слова const сообщит им, что описанные выше оптимизации возможны и должны быть выполнены. Это приводит к лучшей производительности.

Связанный с человеком аспект связан с семантикой ключевого слова. Переменная - это структура данных, которая содержит информацию, которая должна измениться. Константа - это структура данных, которая содержит информацию, которая никогда не изменится. Если есть место для ошибки, var всегда должен быть использован. Однако не вся информация, которая никогда не изменяется в течение жизни программы, должна быть объявлена ​​с помощью const, Если при других обстоятельствах информация должна измениться, используйте var чтобы указать это, даже если фактическое изменение не появляется в вашем коде.

Обновление 2017

Этот ответ все еще получает много внимания. Стоит отметить, что этот ответ был опубликован еще в начале 2014 года, и с тех пор многое изменилось. Поддержка ecmascript-6 теперь является нормой. Все современные браузеры теперь поддерживают const так что это должно быть довольно безопасно использовать без каких-либо проблем.


Оригинальный ответ от 2014 года

Несмотря на довольно приличную поддержку браузера, я бы пока не использовал ее. Из статьи MDN оconst:

Текущая реализация const является специфичным для Mozilla расширением и не является частью ECMAScript 5. Она поддерживается в Firefox & Chrome (V8). Начиная с Safari 5.1.7 и Opera 12.00, если вы определяете переменную с помощью const в этих браузерах, вы все равно можете изменить ее значение позже. Он не поддерживается в Internet Explorer 6-10, но включен в Internet Explorer 11. Ключевое слово const в настоящее время объявляет константу в области действия функции (подобно переменным, объявленным с помощью var).

Затем он продолжает говорить:

const будет определено в ECMAScript 6, но с другой семантикой. Подобно переменным, объявленным с помощью оператора let, константы, объявленные с помощью const, будут иметь область видимости.

Если вы используете const вам придется добавить обходной путь для поддержки немного старых браузеров.

Для чего использовать const, @ Тибос ответ велик.

Но ты сказал:

Из того, что я могу сказать, он используется для создания неизменяемых переменных

Это неправильно Мутирование переменной отличается от переназначения:

var hello = 'world' // assigning
hello = 'bonjour!' // reassigning

С const вы не можете сделать это:

const hello = 'world'
hello = 'bonjour!' // error

Но вы можете изменить свою переменную:

const marks = [92, 83]
marks.push(95)
console.log(marks) // [92, 83, 95] -> the variable has been mutated.

Таким образом, любой процесс, который изменяет значение переменной без использования = знак заглушает.

Замечания: += например это... переназначение!

var a = 5
a += 2 // is the same as a = a + 2

Итак, суть в следующем: const не мешает вам изменять переменные, это предотвращает их повторное назначение.

Чтобы интегрировать предыдущие ответы, есть очевидное преимущество в объявлении постоянных переменных, кроме причины производительности: если вы случайно попытаетесь изменить или повторно объявить их в коде, программа, соответственно, не изменит значение или не выдаст ошибку.

Например, сравните:

// Will output 'SECRET'

const x = 'SECRET'
if (x = 'ANOTHER_SECRET') {  // Warning! assigning a value variable in an if condition
    console.log (x)
}

с:

// Will output 'ANOTHER_SECRET'

var y = 'SECRET'
if (y = 'ANOTHER_SECRET') { 
    console.log (y)
}

или же

// Will throw TypeError: const 'x' has already been declared

const x = "SECRET"

/*  complex code */

var x = 0

с

// Will reassign y and cause trouble

var y = "SECRET"

/*  complex code */

var y = 0

const не является неизменным

Из MDN:

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

var: объявить переменную, инициализация значения необязательна.

let: объявить локальную переменную с областью действия блока.

const: объявить именованную константу только для чтения.

Пример:

var a;
a = 1;
a = 2;//re-initialize possible
var a = 3;//re-declare
console.log(a);//3

let b;
b = 5;
b = 6;//re-initiliaze possible
// let b = 7; //re-declare not possible
console.log(b);

// const c;
// c = 9;   //initialization and declaration at same place
const c = 9;
// const c = 9;// re-declare and initialization is not possible
console.log(c);//9
// NOTE: Constants can be declared with uppercase or lowercase, but a common
// convention is to use all-uppercase letters.

У вас есть отличные ответы, но давайте будем простыми.

const должен использоваться, когда у вас есть определенная константа (читайте как: она не изменится во время выполнения вашей программы).

Например:

const pi = 3.1415926535

Если вы считаете, что это может быть изменено при последующем выполнении, используйте var,

Практическое различие, основанное на примере, состоит в том, что с const вы всегда будете считать, что пи будет 3.14[...], это факт.

Если вы определите это как var, это может быть 3,14 [...] или нет.

Для более технического ответа @Tibos академически прав.

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

Ошибка в вашем тестировании это еще одна вещь, хотя вы пытаетесь создать другую переменную с именем x, это будет более точный тест.

const x = 'const';
x = 'not-const';

Резюме:

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

const a = "value1";

Вы не можете переназначить его с

a = "value2";

Однако, если const-идентификатор содержит объект или массив, его значение можно изменить, если мы не переназначаем его.

const x = { a: 1 }

x.a = 2; //is possible and allowed

const numbers = [1, 2];
numbers.push(3); //is possible and allowed

Пожалуйста, обратите внимание, что const является областью действия блока, так же как let, которая отличается от var (которая является функцией)

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

Гораздо проще рассуждать о коде, когда совершенно очевидно, что можно изменить с помощью переназначения, а что нет. Изменить const на let очень просто. И если по умолчанию использовать const, вам придется дважды подумать, прежде чем делать это. И это во многих случаях хорошо.

Личные предпочтения действительно. Вы можете использовать const, когда, как вы говорите, он не будет переназначен и является постоянным. Например, если вы хотите назначить свой день рождения. Ваш день рождения никогда не меняется, поэтому вы можете использовать его как константу. Но ваш возраст меняется, так что это может быть переменной.

Main point is that how to decide which one identifier should be used during development.
In java-script here are three identifiers.

1. var (Can re-declared & re-initialize)
2. const (Can't re-declared & re-initialize, can update array values by using push)
3. let (Can re-initialize but can't re-declare)

'var': во время кодирования, когда мы говорим о стандарте кода, мы обычно используем имя идентификатора, которое легко понять другому пользователю / разработчику. Например, если мы работаем со многими функциями, где мы используем некоторый ввод, обрабатываем его и возвращаем некоторый результат, например:

**Example of variable use**

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2;
 return result;
}

В вышеприведенных примерах обе функции дают разные результаты, но используют одно и то же имя переменных. Здесь мы видим, что "процесс" и "результат" используются как переменные, и они должны быть.

 **Example of constant with variable**

 const tax = 10; 
 const pi = 3.1415926535; 

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

Перед использованием 'let' в java-скрипте мы должны добавить 'use strict' в начало файла js

 **Example of let with constant & variable**

 const tax = 10; 
 const pi = 3.1415926535; 
 let trackExecution = '';

function firstFunction(input1,input2)
{
 trackExecution += 'On firstFunction'; 
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 trackExecution += 'On otherFunction'; # can add current time 
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

 firstFunction();
 otherFunction();
 console.log(trackExecution);

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

Семантика var а также let

var а также let являются заявлением машине и другим программистам:

Я предполагаю, что значение этого задания изменится в ходе выполнения. Не полагайтесь на конечную ценность этого задания.

Последствия использования var а также let

var а также let заставляют других программистов читать весь промежуточный код от объявления до конечного использования и рассуждать о значении присваивания в этот момент выполнения программы.

Они ослабляют машинное мышление для ESLint и других языковых служб, чтобы правильно обнаруживать ошибочные имена переменных в более поздних присвоениях и повторно использовать имена переменных внешней области, когда внутренняя область забывает объявить.

Они также заставляют среду выполнения выполнять множество итераций по всем кодовым путям, чтобы определить, что они на самом деле являются константами, прежде чем они смогут их оптимизировать. Хотя это меньшая проблема, чем обнаружение ошибок и понимание разработчика.

Когда использовать const

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

"const" объекты

Для объектных ссылок указатель не может быть изменен на другой объект, но объект, который создается и назначается объекту constДекларация является изменяемой. Вы можете добавлять или удалять элементы изconst ссылочный массив и изменить ключи свойств в const указанный объект.

Для создания неизменяемых объектов (что, опять же, упрощает понимание кода людьми и машинами), вы можете Object.freeze объект при объявлении / назначении / создании, например:

const Options = Object.freeze(['YES', 'NO'])

Object.freeze действительно влияет на производительность, но ваш код, вероятно, работает медленно по другим причинам. Вы хотите профилировать это.

Вы также можете инкапсулировать изменяемый объект в конечный автомат и возвращать глубокие копии как значения (так работают состояния Redux и React). См. Раздел Избегание изменяемого глобального состояния в Browser JS, где показан пример того, как это построить из первых принципов.

когда var а также let хорошо подходят

let а также varпредставляют изменяемое состояние. На мой взгляд, они должны использоваться только для моделирования фактического изменяемого состояния. Такие вещи, как "есть ли связь?".

Их лучше всего инкапсулировать в тестируемые конечные автоматы, которые предоставляют постоянные значения, которые представляют "текущее состояние соединения", которое является константой в любой момент времени, и то, что на самом деле интересует остальную часть вашего кода.

Программирование уже достаточно сложно с компоновкой побочных эффектов и преобразованием данных. Превращение каждой функции в непроверенный конечный автомат путем создания изменяемого состояния с переменными просто увеличивает сложность.

Для более подробного объяснения см. Shun the Mutant - The case forconst.

Во-первых, три полезные вещи о const (кроме улучшений области, с которыми он делится let):

  • Для людей, читающих код позже, документально подтверждается, что значение не должно изменяться.
  • Это мешает вам (или любому, кто придет за вами) изменять значение, если только они не вернутся назад и не изменят преднамеренно.
  • Это может сохранить движок JavaScript некоторый анализ с точки зрения оптимизации. Например, вы объявили, что значение не может измениться, поэтому движку не нужно выполнять работу, чтобы выяснить, изменяется ли значение, чтобы он мог решить, следует ли оптимизировать, основываясь на неизменяемом значении.

Ваши вопросы:

Когда уместно использовать const на месте var?

Вы можете сделать это в любое время, когда объявляете переменную, значение которой никогда не меняется. Считаете ли вы, что это уместно, полностью зависит от ваших предпочтений / предпочтений вашей команды.

Должен ли он использоваться каждый раз, когда объявляется переменная, которая не будет переназначена?

Это зависит от вас / вашей команды.

Имеет ли это какое-то значение, если var is used in place ofconst` или наоборот?

Да:

  • var а также const имеют разные правила видимости. (Возможно, вы хотели сравнить с let скорее, чем var.) В частности: const а также let имеют блочную область и при использовании в глобальной области видимости не создают свойства глобального объекта (даже если они создают глобальные объекты). var имеет либо глобальную область (при использовании в глобальной области), либо область действия функции (даже если используется в блоке), а при использовании в глобальной области создает свойство для глобального объекта.
  • Смотрите мои "три полезные вещи" выше, все они относятся к этому вопросу.

Он обеспечивает: 1) постоянную ссылку, например, const x = [] - массив можно изменить, но x не может указывать на другой массив; и 2) блокировать область видимости. const и let вместе заменят var в ecma6/2015. См. обсуждение на https://strongloop.com/strongblog/es6-variable-declarations/

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

Что касается var, поскольку ES6 отсутствует, я никогда не использовал его в производственном коде и не могу придумать для него вариант использования. Один из моментов, который можно было бы рассмотреть для его использования, - это хостинг JavaScript - хотя let и const не поднимаются, объявление var -. Тем не менее, помните, что переменные, объявленные с помощью var, имеют область действия функции, а не область действия блока ("если они объявлены вне какой-либо функции, они будут глобально доступны во всей программе; если объявлены в функции, они доступны только в самой функции", в HackerRank - Ключевые слова объявления переменных). Вы можете думать о let как о блочной версии var.

Я не эксперт в области компиляции JS, но есть смысл сказать, что v8 использует флаг const

Обычно после объявления и изменения группы переменных память фрагментируется, и v8 останавливается для выполнения, делает паузу на несколько секунд, чтобы сделать gc или сборщик мусора.

если переменная объявлена ​​с помощью const v8, можно с уверенностью поместить ее в плотный контейнер фиксированного размера между другими переменными const, поскольку она никогда не изменится. Он также может сохранить правильные операции для этих типов данных, так как тип не изменится.

"const" указывает вашему коду, что идентификатор не будет переназначен. Это хорошая статья о том, когда использовать "const", "let" или "var" https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75

Мое мнение:

В. Когда уместно использовать const на месте var?
Никогда!

В: Следует ли его использовать каждый раз, когда объявляется переменная, которая не будет переназначена?
Никогда! Как будто это сократит потребление ресурсов...

В. Действительно ли имеет значение, если var используется вместо constили наоборот?
A: Да! С помощьюvarэто путь! Намного проще использовать инструменты разработчика и сэкономить на создании нового файла (ов) для тестирования. (var не вместо const - const пытается взять varместо...)

Extra A: То же самое касается let. JavaScript - свободный язык - почемуconstрикт это?!?

Другие вопросы по тегам