Я недавно сталкивался с 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
или наоборот?
Ответы:
В ваших вопросах есть два аспекта: каковы технические аспекты использования
const
вместо,var
и каковы связанные с этим аспекты, связанные с человеком.Техническая разница значительна. В скомпилированных языках константа будет заменена во время компиляции, и ее использование позволит проводить другие оптимизации, такие как удаление мертвого кода, для дальнейшего повышения эффективности кода во время выполнения. Последние (свободно используемые термины) движки JavaScript на самом деле компилируют код JS для повышения производительности, поэтому использование ключевого слова const сообщит им, что описанные выше оптимизации возможны и должны быть выполнены. Это приводит к лучшей производительности.
Человеческий аспект связан с семантикой ключевого слова. Переменная - это структура данных, которая содержит информацию, которая должна измениться. Константа - это структура данных, которая содержит информацию, которая никогда не изменится. Если есть место для ошибки,
var
всегда следует использовать. Однако не вся информация, которая никогда не изменяется в течение жизни программы, должна быть объявленаconst
. Если при других обстоятельствах информация должна измениться, используйте,var
чтобы указать это, даже если фактическое изменение не появляется в вашем коде.источник
const
объекты кажутся изменчивыми, поэтому я не уверен, насколько строгим является JS-компилятор. Может быть, «использовать строгий» режим тоже имеет значение.const
просто предотвращает переназначение «переменной» на другое значение.const a = {}; a = {};
выдаст ошибку в строгом режиме.If there is room for error, var should always be used
, Сегодня это больше не применяется, поскольку такие инструменты, как ESLint, сразу указывают наconst
нарушение.Обновление 2017
Этот ответ все еще получает много внимания. Стоит отметить, что этот ответ был опубликован еще в начале 2014 года, и с тех пор многое изменилось.ECMAScript-6поддержка сейчас норма. Все современные браузеры теперь поддерживают,
const
поэтому его можно без проблем использовать.Оригинальный ответ от 2014
Несмотря на довольно приличную поддержку браузера , я бы пока не использовал ее. Из статьи MDN о
const
:Затем он продолжает говорить:
Если вы все-таки используете,
const
вам придется добавить обходной путь для поддержки немного старых браузеров.источник
Зачем пользоваться
const
, ответ @ Tibos отличный.Но ты сказал:
Это неправильно . Мутирование переменной отличается от переназначения:
С const вы не можете сделать это:
Но вы можете изменить свою переменную:
Таким образом, любой процесс, который изменяет значение переменной без использования
=
знака , изменяет переменную.Примечание:
+=
например ... переназначение!Таким образом, нижняя строка:
const
не мешает вам мутирует переменные, он предотвращает вас от повторного назначения им.источник
=
знака, отключается», технически неверно. Например,const marks=[92,83]; marks[2]=95; console.log(marks)
будет выводить[92, 83, 95]
.marks
был видоизменен через знак равенства.const
в контексте массивов (аналогично примеру @chharvey). В случае повторно назначается каждый раз. Так зачем использовать а не ?const countArray = countup(n - 1); countArray.push(n);
const
const
var
const countArray
, он никогда не будет переназначен. Вы все еще можете нажать на массив, который изменяет его члены и длину, но мы не называем это переназначением. вы используетеconst
вместоlet
илиvar
когда вы хотите предотвратить переназначение. Кстати , если вы действительно хотите , чтобы переназначить,let
почти всегда лучше , чемvar
.Чтобы интегрировать предыдущие ответы, есть очевидное преимущество в объявлении постоянных переменных, кроме причины производительности: если вы случайно попытаетесь изменить или повторно объявить их в коде, программа, соответственно, не изменит значение или не выдаст ошибку.
Например, сравните:
с:
или
с
источник
const
не является неизменнымИз MDN :
источник
const
неизменяем. Для объектов и массивов его нельзя переназначить, но содержимое можно изменить (например, array.push).const
или нет, это не влияет.var : объявить переменную, инициализация значения необязательна.
let : объявить локальную переменную с областью действия блока.
const : объявить именованную константу только для чтения.
Пример:
источник
У вас есть отличные ответы, но давайте будем простыми.
const
должен использоваться, когда у вас есть определенная константа (читается как: она не изменится во время выполнения вашей программы).Например:
Если вы считаете, что это может быть изменено при последующем выполнении, используйте a
var
.Практическое различие, основанное на примере, состоит в том, что с
const
вами всегда будет предполагаться, что pi будет 3,14 [...], это факт.Если вы определите его как
var
, это может быть 3.14 [...] или нет.Для более технического ответа @Tibos академически прав.
источник
По своему опыту я использую const, когда хочу установить что-то, что, возможно, захочу изменить позже, без необходимости искать код, ищущий жестко закодированные биты, например, путь к файлу или имя сервера.
Ошибка в вашем тестировании это еще одна вещь, хотя вы пытаетесь создать другую переменную с именем x, это будет более точный тест.
источник
Личные предпочтения действительно. Вы можете использовать const, когда, как вы говорите, он не будет переназначен и является постоянным. Например, если вы хотите назначить свой день рождения. Ваш день рождения никогда не меняется, поэтому вы можете использовать его как константу. Но ваш возраст меняется, так что это может быть переменной.
источник
Резюме:
const создает неизменяемую привязку, означающую, что идентификатор переменной const нельзя переназначать.
Вы не можете переназначить его с
Однако, если const-идентификатор содержит объект или массив, его значение можно изменить, если мы не переназначаем его.
Обратите внимание, что const является областью видимости блоков, как и let, которая не совпадает с var (которая находится в области функций)
Короче говоря, когда что-то вряд ли изменится при повторном назначении, используйте const, иначе используйте let или var в зависимости от области, которую вы хотели бы иметь.
Гораздо проще рассуждать о коде, когда он абсолютно очевиден, что можно изменить с помощью переназначения, а что нельзя. Изменить const на let очень просто. И если по умолчанию использовать const, вам придется дважды подумать, прежде чем делать это. И это во многих случаях хорошо.
источник
Он обеспечивает: 1) постоянную ссылку, например, const x = [] - массив можно изменить, но x не может указывать на другой массив; и 2) блокировать область видимости. const и let вместе заменят var в ecma6 / 2015. См. обсуждение на https://strongloop.com/strongblog/es6-variable-declarations/
источник
источник
Во-первых, о трех полезных вещах
const
(кроме улучшений области, с которыми он делитсяlet
):Ваши вопросы:
Вы можете сделать это в любое время, когда объявляете переменную, значение которой никогда не меняется. Считаете ли вы, что это уместно, полностью зависит от ваших предпочтений / предпочтений вашей команды.
Это зависит от вас / вашей команды.
Да:
var
иconst
имеют разные правила видимости. (Возможно, вы захотите сравнить сlet
чем, а не сvar
.) В частности:const
иlet
имеют блочную область и при использовании в глобальной области не создают свойства глобального объекта (даже если они создают глобальные объекты).var
имеет либо глобальную область (при использовании в глобальной области), либо область действия функции (даже если используется в блоке), а при использовании в глобальной области создает свойство для глобального объекта.источник
Семантика
var
иlet
var
иlet
это заявление для машины и других программистов:Последствия использования
var
иlet
var
иlet
заставлять других программистов читать весь промежуточный код из декларации для возможного использования, а также рассуждать о значении присваивания в тот момент выполнения программы.Они ослабляют машинные рассуждения для ESLint и других языковых служб для правильного определения неверно введенных имен переменных в более поздних присваиваниях и повторного использования области имен переменных внешней области видимости, когда внутренняя область забывает декларировать.
Они также заставляют среды выполнения выполнять много итераций по всем кодовым путям, чтобы обнаружить, что они на самом деле являются константами, прежде чем они смогут их оптимизировать. Хотя это меньше проблем, чем обнаружение ошибок и понятность для разработчиков.
Когда использовать
const
Если значение ссылки не изменяется ход выполнения, правильный синтаксис , чтобы выразить намерение состоит в том программист
const
. Для объектов изменение значения ссылки означает указание на другой объект, поскольку ссылка неизменна, а объект - нет."
const
" объектыДля ссылок на объекты указатель не может быть изменен на другой объект, но объект, который создается и назначается
const
объявлению, является изменяемым. Вы можете добавлять или удалять элементы изconst
ссылочного массива, а также изменять ключи свойств дляconst
ссылочного объекта.Чтобы достичь неизменных объектов (что опять же упрощает анализ вашего кода для людей и машин), вы можете
Object.freeze
создать объект при объявлении / назначении / создании, например:Object.freeze влияет на производительность, но ваш код, вероятно, работает медленно по другим причинам. Вы хотите профилировать это.
Вы также можете инкапсулировать изменяемый объект в конечный автомат и возвращать глубокие копии в качестве значений (так работают состояния Redux и React). Посмотрите Избежание изменяемого глобального состояния в Браузере JS для примера того, как построить это из первых принципов.
Когда
var
иlet
подойдемlet
иvar
представляют изменяемое состояние. Они должны, на мой взгляд, использоваться только для моделирования фактического изменчивого состояния . Такие вещи, как « жива ли связь? ».Они лучше всего инкапсулированы в тестируемых конечных автоматах, которые предоставляют постоянные значения, которые представляют « текущее состояние соединения », которое является константой в любой момент времени, и что на самом деле интересует остальная часть вашего кода.
Программирование уже достаточно сложное с составлением побочных эффектов и преобразованием данных. Превращение каждой функции в непроверяемый конечный автомат путем создания изменяемого состояния с переменными просто накапливает сложность.
Для более подробного объяснения см. Shun the Mutant - Дело за
const
.источник
«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, поскольку она никогда не изменится Он также может сохранить правильные операции для этих типов данных, так как тип не изменится.
источник
Когда дело доходит до решения между let и const , всегда предпочитайте const, чтобы использование было понятно в коде. Таким образом, если вы попытаетесь переопределить переменную, вы получите ошибку. Если нет другого выбора, кроме как изменить его, просто переключитесь на let . Обратите внимание, что, как говорит Энтони , значения не являются неизменяемыми (например, у объекта const свойства могут изменяться).
Когда дело доходит до var , поскольку ES6 отсутствует, я никогда не использовал его в производственном коде и не могу придумать какой-либо вариант его использования. Однако следует помнить, что переменные, объявленные с помощью var , не имеют области видимости блока.
источник