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

Я недавно наткнулся на const ключевое слово в javascript. Из того, что я могу сказать, он используется для создания неизменяемые переменные, и я проверил, чтобы убедиться, что он не может быть переопределен (в узел.в 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 поэтому он должен быть довольно безопасным в использовании без каких-либо проблем.


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

несмотря на то, что довольно приличная поддержка браузера, Я бы не использовал его сейчас. От статья 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 вам придется добавить обходной путь к поддержка немного старых браузеров.


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

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

// 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 is не незыблемыми.

С MDN:

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


зачем использовать const, отличный ответ @Tibos по.

но ты сказал:

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

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

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 не препятствовать мутация переменные, это предотвращает вас от повторное назначение них.


у вас есть хорошие ответы, но давайте держать его простым.

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

например:

const pi = 3.1415926535

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

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

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

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


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

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

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

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


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


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

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

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

Ex:

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 (кроме улучшений области, которые он разделяет с let):

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

вопросы:

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

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

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

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

действительно ли это имеет значение, если var is used in place ofconst ' или наоборот?

да:

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

резюме:

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 это блок-уровня как пусть что не то же самое, что var (который является функцией уровня)

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

гораздо проще рассуждать о коде, когда совершенно очевидно, что можно изменить путем повторного назначения, а что нет. Изменить const на let очень просто. И собирается 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;
}

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

 **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);

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


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


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

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

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