Конст в 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?

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

Действительно ли имеет значение, если вместо const или наоборот? var?

Ответ 1

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

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

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

Ответ 2

Обновление 2017

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


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

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

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

Далее следует:

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

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

Ответ 3

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

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

// 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

Ответ 4

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

Из MDN:

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

Ответ 5

Зачем использовать 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.

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

Примечание: +=, например,... re-assigning!

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

Итак, нижняя строка: const не мешает вам перебирать переменные, это мешает вам повторно назначать их.

Ответ 6

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

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

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

Ответ 7

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

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

Например:

const pi = 3.1415926535

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

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

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

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

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

Это вам/вашей команде.

Действительно ли имеет значение, если var is used in place of const` или наоборот?

Да:

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

Ответ 12

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

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

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