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 на месте ВАР?
должен ли он использоваться каждый раз, когда объявляется переменная, которая не будет повторно назначена?
действительно ли это имеет значение, если ВАР вместо 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и не незыблемыми.С 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?вы можете делайте это каждый раз, когда вы объявляете переменную, значение которой никогда не меняется. Считаете ли вы это уместно полностью зависит от ваших предпочтений / предпочтений вашей команды.
должен ли он использоваться каждый раз, когда объявляется переменная, которая не будет повторно назначена?
это зависит от вас / вашей команды.
действительно ли это имеет значение, если
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 это блок-scoped как пусть что не то же, что и ВАР (который является функцией уровня)
короче говоря, когда что-то вряд ли изменить путем назначения использовать const использовать пусть или ВАР в зависимости от объема вы хотели бы получить.
гораздо проще рассуждать о коде, когда совершенно очевидно, что может быть изменено путем повторного назначения, а что не может быть. Изменить константу на let очень просто. И будут константными по умолчанию заставляет задуматься дважды, прежде чем сделать это. И это во многих случаях хорошо.
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, так как она никогда не изменить. Он также может сохранять правильные операции для этих типов данных, так как тип не изменится.
Comments