Const w javascript? Kiedy go używać i czy jest to konieczne

Ostatnio natknąłem się na const słowo kluczowe w javascript. Z tego, co mogę powiedzieć, jest on używany do tworzenia zmiennych niezmiennych , i przetestowałem, aby upewnić się, że nie można go przedefiniować (w węźle."js"): {]}

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

// Will give an error: 'constant 'x' has already been defined'

Zdaję sobie sprawę, że nie jest to jeszcze ustandaryzowane we wszystkich przeglądarkach - ale interesuje mnie tylko kontekst węzła.js / v8, i zauważyłem, że niektórzy deweloperzy/projekty wydają się mocno faworyzować, gdy słowo kluczowe var może być użyte do ten sam efekt.

Pytania ?

Kiedy należy stosować const zamiast var?

Czy powinien być używany za każdym razem, gdy zadeklarowana jest zmienna, która nie ma być ponownie przypisana?

Czy rzeczywiście robi jakąś różnicę, czy varjest używany zamiast const czy odwrotnie?

Author: Community, 2014-01-20

15 answers

Twoje pytania dotyczą dwóch aspektów: jakie są techniczne aspekty korzystania z const zamiast var i jakie są aspekty związane z człowiekiem.

Różnica techniczna jest znacząca. W językach skompilowanych stała zostanie zastąpiona w czasie kompilacji, a jej użycie pozwoli na inne optymalizacje, takie jak usunięcie martwego kodu, aby jeszcze bardziej zwiększyć wydajność działania kodu. Najnowsze (luźno używane określenie) silniki JavaScript faktycznie kompilują kod JS, aby uzyskać lepsze wydajność, więc użycie słowa kluczowego const poinformuje ich, że opisane powyżej optymalizacje są możliwe i powinny zostać wykonane. Skutkuje to lepszą wydajnością.

Aspekt związany z człowiekiem dotyczy semantyki słowa kluczowego. Zmienna jest strukturą danych, która zawiera informacje, które mają ulec zmianie. Stała to struktura danych, która zawiera informacje, które nigdy się nie zmienią. Jeśli jest miejsce na błąd, var powinno być zawsze używane. Jednak nie wszystkie informacje, które nigdy nie zmienia się w czasie życia programu musi być zadeklarowana za pomocą const. Jeśli w innych okolicznościach informacje powinny się zmienić, użyj var, aby to zaznaczyć, nawet jeśli rzeczywista zmiana nie pojawia się w Twoim kodzie.

 385
Author: Tibos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 15:22:03

2017 Update

Ta odpowiedź wciąż cieszy się dużą uwagą. Warto zauważyć, że ta odpowiedź została opublikowana na początku 2014 roku i od tego czasu wiele się zmieniło. ecmascript-6 wsparcie jest teraz normą. wszystkie nowoczesne przeglądarki obsługują teraz const, więc powinno być całkiem bezpieczne w użyciu bez żadnych problemów.


Oryginalna odpowiedź z 2014

Pomimo dość przyzwoitej obsługi przeglądarki , unikałbym używania jej do teraz. Z artykułu MDN o const:

Obecna implementacja const jest rozszerzeniem specyficznym dla Mozilli i nie jest częścią ECMAScript 5. Jest obsługiwany w przeglądarce Firefox i Chrome (V8). Począwszy od Safari 5.1.7 i opery 12.00, jeśli zdefiniujesz zmienną z const w tych przeglądarkach, nadal możesz zmienić jej wartość później. Nie jest obsługiwany w Internet Explorer 6-10, ale jest zawarty w Internet Explorer 11. Słowo kluczowe const deklaruje obecnie stałą w zakresie funkcji (jak zmienne zadeklarowane za pomocą var).

Potem mówi:

const będzie zdefiniowany przez ECMAScript 6, ale z inną semantyką. Podobnie jak zmienne zadeklarowane za pomocą instrukcji let, stałe zadeklarowane za pomocą const będą miały zasięg blokowy.

Jeśli używasz const, będziesz musiał dodać obejście, aby obsługiwać nieco starsze przeglądarki.

 66
Author: James Donnelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-10 10:16:18

Aby zintegrować poprzednie odpowiedzi, jest oczywistą zaletą w deklarowaniu stałych zmiennych, oprócz przyczyny wydajności: jeśli przypadkowo spróbujesz zmienić lub ponownie zadeklarować je w kodzie, program odpowiednio nie zmieni wartości lub nie wyrzuci błędu.

Na przykład Porównaj:

// Will output 'SECRET'

const x = 'SECRET'
if (x = 'ANOTHER_SECRET') {  // Warning! assigning a value variable in an if condition
    console.log (x)
}

Z:

// Will output 'ANOTHER_SECRET'

var y = 'SECRET'
if (y = 'ANOTHER_SECRET') { 
    console.log (y)
}

Lub

// Will throw TypeError: const 'x' has already been declared

const x = "SECRET"

/*  complex code */

var x = 0

Z

// Will reassign y and cause trouble

var y = "SECRET"

/*  complex code */

var y = 0
 33
Author: janesconference,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-07 11:15:36

const jest nie niezmienne.

Z MDN :

Deklaracja const tworzy odniesienie tylko do odczytu do wartości. Informatyka nie oznacza, że posiadana wartość jest niezmienna, tylko, że zmienna identyfikator nie może być ponownie przypisany.

 27
Author: Antoine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-25 19:12:41

Po co używać const, odpowiedź @ Tibos jest świetna.

Ale powiedziałeś:

Z tego co wiem, służy do tworzenia zmiennych niezmiennych

To jest źle . Mutacja zmiennej różni się od przypisania:

var hello = 'world' // assigning
hello = 'bonjour!' // reassigning

Z const nie możesz tego zrobić:

const hello = 'world'
hello = 'bonjour!' // error

Ale możesz mutować swoją zmienną:

const marks = [92, 83]
marks.push(95)
console.log(marks) // [92, 83, 95] -> the variable has been mutated.

Więc każdy proces, który zmienia wartość zmiennej bez używając znaku = jest mutingiem.

Uwaga: += na przykład jest ... / align = "left" /

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

Reasumując: const nie uniemożliwia mutowania zmiennych, ale uniemożliwia ponowne przypisywanie ich {26]}.

 19
Author: math2001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 21:12:03

Masz świetne odpowiedzi, ale niech to będzie proste.

const powinien być stosowany, gdy masz zdefiniowaną stałą (Czytaj jako: nie zmieni się podczas wykonywania programu).

Na przykład:

const pi = 3.1415926535

Jeśli uważasz, że jest to coś, co może zostać zmienione w późniejszym wykonaniu, użyj var.

Praktyczna różnica, oparta na przykładzie, polega na tym, że z const zawsze będzie tak, że pi będzie wynosić 3,14[...], to fakt.

Jeśli zdefiniujesz go jako var, to może być 3,14[... albo nie.

Dla bardziej technicznej odpowiedzi @Tibos ma akademicką rację.

 9
Author: Edgar Griñant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 15:29:19

Z mojego doświadczenia wynika, że używam const Gdy chcę ustawić coś, co mogę później zmienić bez konieczności szukania w kodzie bitów, które zostały zakodowane na twardo, np. ścieżki pliku lub nazwy serwera.

Błąd w Twoim teście to jednak inna sprawa, próbujesz zrobić inną zmienną o nazwie x, to byłby dokładniejszy test.

const x = 'const';
x = 'not-const';
 6
Author: Funkotron_King,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 15:02:08

Osobiste preferencje naprawdę. Możesz użyć const, gdy, jak mówisz, nie będzie ponownie przypisany i jest stały. Na przykład, jeśli chcesz przypisać swoje urodziny. Twoje urodziny nigdy się nie zmieniają, więc możesz używać ich jako stałej. Ale twój wiek się zmienia, więc to może być zmienna.

 3
Author: Carl Markham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 14:59:35

Zapewnia: 1) stała odniesienia, np. const x = [] - tablica może być modyfikowana, ale x nie może wskazywać na inną tablicę; oraz 2) blokowanie zakresu. const i let wspólnie zastąpią var w ecma6/2015 Zobacz dyskusję na https://strongloop.com/strongblog/es6-variable-declarations/

 2
Author: Genovo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-07 12:38:13

Var : deklaruje zmienną, inicjalizacja wartości opcjonalna.

Let : Declare a local variable with block scope.

Const : deklaruje stałą tylko do odczytu.

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.
 2
Author: Srikrushna Pal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 19:59:12

Po pierwsze, trzy przydatne rzeczy o const (poza ulepszeniami zakresu, które dzieli z let):

  • dokumentuje osobom czytającym kod później, że wartość nie może się zmieniać.
  • zapobiega to zmianie wartości przez Ciebie (lub kogokolwiek, kto przyjdzie po ciebie), chyba że cofną się i celowo zmienią deklarację.
  • It Może Zapisz silnik JavaScript trochę analizy pod kątem optymalizacji. Np. zadeklarowałeś, że wartość nie można zmienić, więc silnik nie musi pracować, aby dowiedzieć się, czy wartość się zmienia, więc może zdecydować, czy optymalizować na podstawie wartości nie zmienia.
Twoje pytania:

Kiedy należy stosować const zamiast var?

Ty możesz to zrobić za każdym razem, gdy deklarujesz zmienną, której wartość nigdy się nie zmienia. To, czy uznasz to za stosowne, zależy wyłącznie od Twoich preferencji / Twojego zespołu preferencje.

Czy powinien być używany za każdym razem, gdy zadeklarowana jest zmienna, która nie ma być ponownie przypisana?

To zależy od Ciebie / Twojego zespołu.

Czy to naprawdę robi jakąś różnicę, jeśli var is used in place of const ' czy vice-versa?

Tak:

  • var i const mają różne zasady dotyczące zakresu. (Mogłeś chcieć porównać z let zamiast var.) W szczególności: const i let są o zasięgu blokowym i, gdy są używane w zasięgu globalnym, nie tworzy właściwości na obiekcie globalnym (nawet jeśli tworzą one obiekty globalne). var ma globalny zakres (gdy jest używany w globalnym zakresie) lub zakres funkcji (nawet jeśli jest używany w bloku), a gdy jest używany w globalnym zakresie, tworzy właściwość na obiekcie globalnym.
  • Zobacz moje" trzy przydatne rzeczy " powyżej, wszystkie odnoszą się do tego pytania.
 1
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-04 08:35:26

Podsumowanie:

Const tworzy niezmienne powiązanie co oznacza, że identyfikator zmiennej const nie jest możliwy do ponownego przypisania.

const a = "value1";

Nie można go ponownie przypisać za pomocą

a = "value2";

Jeśli jednak identyfikator const zawiera obiekt lub tablicę, jego wartość może zostać zmieniona, o ile nie przypiszemy jej ponownie.

const x = { a: 1 }

x.a = 2; //is possible and allowed

const numbers = [1, 2];
numbers.push(3); //is possible and allowed

Proszę zauważyć, że const jest blok-scoped podobnie jak let , który nie jest taki sam jak var (który jest function-scoped)

W krótko, gdy coś nie może zmienić się poprzez ponowne przypisanieużyj constelse użyj letlub var w zależności od zakresu, który chcesz mieć.

O wiele łatwiej jest rozumować o kodzie, gdy jest oczywiste, co można zmienić poprzez ponowne przypisanie, a co nie. Zmiana const na let jest bardzo prosta. A przechodzenie const domyślnie sprawia, że zastanów się dwa razy, zanim to zrobisz. I w wielu przypadkach jest to dobra rzecz.

 1
Author: Tejas Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 00:03:50
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' : w momencie kodowania, gdy mówimy o standardzie kodu, zwykle używamy nazwy identyfikatora, która jest łatwa do zrozumienia przez innego użytkownika/programistę. Na przykład, jeśli pracujemy nad wieloma funkcjami, w których używamy jakiegoś wejścia i przetwarzamy to i zwracamy jakiś wynik, jak:

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

W powyższych przykładach obie funkcje generują różne-2 wyniki, ale używają tej samej nazwy zmiennych. Tutaj możemy zobaczyć 'proces' i 'wynik' oba są używane jako zmienne i powinny być.

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

Przed użyciem ' let 'w java-script musimy dodać' use strict ' na górze pliku 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);

W powyższym przykładzie możesz śledzić, która funkcja jest wykonywana, gdy & która funkcja nie jest używana podczas konkretnej akcji.

 1
Author: vinod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 11:22:00

'const' oznacza w kodzie, że identyfikator nie zostanie ponownie przypisany. Jest to dobry artykuł o tym, kiedy używać 'const', 'let'lub ' var' https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.ukgxpfhao

 0
Author: Ananda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 14:57:52

Nie jestem ekspertem w dziedzinie kompilacji JS, ale warto powiedzieć, że v8 korzysta z flagi const

Zwykle a po zadeklarowaniu i zmianie kilku zmiennych, pamięć zostaje fragmentowana, a v8 zatrzymuje się, aby wykonać, robi pauzę przez kilka sekund, aby zrobić gc lub garbage collection.

Jeśli zmienna jest zadeklarowana z const v8 można mieć pewność, aby umieścić ją w ciasnym kontenerze o stałym rozmiarze między innymi zmiennymi const, ponieważ nigdy nie będzie zmiana. Może również zapisać odpowiednie operacje dla tych typów danych, ponieważ Typ nie ulegnie zmianie.

 0
Author: Jew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-24 18:03:56