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 или наоборот?

841   15  

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 of const ' или наоборот?

да:

  • 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

    Ничего не найдено.