Ostatnio natrafiłem na const
słowo kluczowe w JavaScript. Z tego, co mogę powiedzieć, jest on używany do tworzenia niezmiennych zmiennych , i przetestowałem, aby upewnić się, że nie można go przedefiniować (w Node.js):
const x = 'const';
const x = 'not-const';
// Will give an error: 'constant 'x' has already been defined'
Zdaję sobie sprawę, że nie jest on jeszcze ustandaryzowany we wszystkich przeglądarkach - ale interesuje mnie tylko kontekst Node.js V8 , i zauważyłem, że niektórzy programiści / projekty wydają się faworyzować go, gdy var
słowo kluczowe może być użyte do ten sam efekt.
Więc moje pytania to:
- Kiedy należy używać
const
zamiastvar
? - Czy należy go używać za każdym razem, gdy deklarowana jest zmienna, która nie będzie ponownie przypisywana?
- Czy faktycznie robi to różnicę, jeśli
var
jest stosowany zamiastconst
lub odwrotnie?
Odpowiedzi:
Pytania mają dwa aspekty: jakie są techniczne aspekty korzystania
const
zamiastvar
i jakie są związane z tym ludzkie aspekty.Różnica techniczna jest znacząca. W skompilowanych językach stała zostanie zastąpiona w czasie kompilacji, a jej użycie pozwoli na inne optymalizacje, takie jak usuwanie martwego kodu, w celu dalszego zwiększenia wydajności środowiska wykonawczego kodu. Najnowsze (luźno używane określenie) silniki JavaScript faktycznie kompilują kod JS, aby uzyskać lepszą wydajność, więc użycie słowa kluczowego const poinformuje ich, że opisane powyżej optymalizacje są możliwe i powinny zostać wykonane. Powoduje to lepszą wydajność.
Aspekt związany z człowiekiem dotyczy semantyki słowa kluczowego. Zmienna to struktura danych zawierająca informacje, które powinny ulec zmianie. Stała to struktura danych, która zawiera informacje, które nigdy się nie zmienią. Jeśli jest miejsce na błędy,
var
należy zawsze używać. Jednak nie wszystkie informacje, które nigdy nie zmieniają się w czasie trwania programu, muszą zostać zadeklarowane za pomocąconst
. Jeśli w różnych okolicznościach informacje powinny ulec zmianie, użyj,var
aby to zaznaczyć, nawet jeśli rzeczywista zmiana nie pojawia się w kodzie.źródło
const
obiekty wydają się być zmienne, więc nie jestem pewien, jak bardzo kompilator JS jest naprawdę. Może tryb „użyj ścisłego” również robi różnicę.const
po prostu zapobiega zmianie przypisania „zmiennej” do innej wartości.const a = {}; a = {};
wyrzuci błąd w trybie ścisłym.If there is room for error, var should always be used
. Dziś nie ma to już zastosowania, a narzędzia takie jak ESLint natychmiast wskazują naconst
naruszenie.Aktualizacja 2017
Ta odpowiedź wciąż cieszy się dużym zainteresowaniem. Warto zauważyć, że ta odpowiedź została opublikowana na początku 2014 roku i od tego czasu wiele się zmieniło.ecmascript-6wsparcie jest teraz normą. Wszystkie nowoczesne przeglądarki obsługują teraz,
const
więc korzystanie z niego powinno być całkiem bezpieczne bez żadnych problemów.Oryginalna odpowiedź z 2014 roku
Pomimo dość przyzwoitej obsługi przeglądarki , na razie unikałbym jej używania. Z artykułu MDN na temat
const
:Następnie mówi:
Jeśli używasz,
const
musisz dodać obejście, aby obsługiwać nieco starsze przeglądarki.źródło
Po co korzystać
const
, odpowiedź @ Tibos jest świetna.Ale powiedziałeś:
Że jest źle . Mutowanie zmiennej różni się od zmiany przypisania:
Z const nie możesz tego zrobić:
Ale możesz mutować swoją zmienną:
Tak więc każdy proces, który zmienia wartość zmiennej bez użycia
=
znaku, mutuje zmienną.Uwaga:
+=
na przykład to ... ponowne przypisanie!Podsumowując:
const
nie przeszkadza ci mutować zmiennych, nie pozwala ci na ich ponowne przypisanie .źródło
=
znaku wycisza się” jest technicznie niepoprawny. Na przykładconst marks=[92,83]; marks[2]=95; console.log(marks)
wyświetli[92, 83, 95]
.marks
został zmutowany za pomocą znaku równości.const
w kontekście tablic (podobnie jak w przykładzie użytym @chharvey). W przypadku jest ponownie przypisane za każdym razem. Dlaczego więc korzystać, a nie ?const countArray = countup(n - 1); countArray.push(n);
const
const
var
const countArray
, to będzie nigdy być przeniesiony. Nadal możesz przesuwać do tablicy, która zmienia jej elementy i długość, ale nie nazywamy tego ponownym przypisywaniem. używaszconst
zamiastlet
lubvar
gdy chcesz zapobiec zmianie przypisania. BTW, jeśli nie chcesz, aby realokacja,let
jest prawie zawsze lepsze niżvar
.Aby zintegrować poprzednie odpowiedzi, istnieje oczywista zaleta w deklarowaniu zmiennych stałych, oprócz przyczyny wydajności: jeśli przypadkowo spróbujesz je zmienić lub ponownie zadeklarować w kodzie, program odpowiednio nie zmieni wartości ani nie zgłosi błędu.
Na przykład porównaj:
z:
lub
z
źródło
const
nie jest niezmienny.Z MDN :
źródło
const
są niezmienne. W przypadku obiektów i tablic nie można go ponownie przypisać, ale zawartość można zmienić (np. Array.push).const
czy nie, nie ma na to wpływu.var : Deklaracja zmiennej, inicjalizacja wartości opcjonalna.
let : Deklaracja zmiennej lokalnej o zasięgu bloku.
const : Zadeklaruj stałą tylko do odczytu.
Dawny:
źródło
Masz świetne odpowiedzi, ale bądźmy prostsze.
const
powinien być używany, gdy masz zdefiniowaną stałą (czytaj jako: nie zmieni się podczas wykonywania programu).Na przykład:
Jeśli uważasz, że jest to coś, co można zmienić w późniejszym wykonaniu, użyj
var
.Różnica praktyczna, oparta na tym przykładzie, polega na tym, że przy założeniu,
const
że pi będzie wynosić 3,14 [...], to fakt.Jeśli zdefiniujesz to jako
var
, może to być 3,14 [...] lub nie.Aby uzyskać bardziej techniczną odpowiedź, @Tibos ma rację akademicką.
źródło
Z mojego doświadczenia używam const, gdy chcę ustawić coś, co chciałbym zmienić później, bez konieczności przeszukiwania kodu w poszukiwaniu bitów, które zostały zakodowane na stałe, np. Ścieżka do pliku lub nazwa serwera.
Błąd w testowaniu to kolejna sprawa, próbujesz stworzyć inną zmienną o nazwie x, byłby to dokładniejszy test.
źródło
Naprawdę osobiste preferencje. Możesz użyć const, gdy, jak mówisz, nie zostanie on ponownie przypisany i będzie stały. Na przykład, jeśli chcesz przypisać swoje urodziny. Twoje urodziny nigdy się nie zmieniają, więc możesz użyć go jako stałej. Ale twój wiek się zmienia, więc może to być zmienna.
źródło
Podsumowanie:
const tworzy niezmienne wiązanie, co oznacza, że identyfikator zmiennej const nie nadaje się do ponownego przypisania.
nie można go ponownie przypisać za pomocą
Jeśli jednak identyfikator const zawiera obiekt lub tablicę, jego wartość można zmienić, o ile nie przypisujemy go ponownie.
Zauważ, że const ma zasięg blokowy, podobnie jak let, który nie jest taki sam jak var (który ma zasięg funkcjonalny)
W skrócie: Jeśli coś nie zmieni się w wyniku ponownego przypisania, użyj const lub użyj let lub var w zależności od zakresu, który chcesz mieć.
O wiele łatwiej jest uzasadnić kod, gdy nie wiadomo, co można zmienić poprzez zmianę przypisania, a co nie. Zmiana stałej na let jest bardzo prosta. A przejście do trybu domyślnego powoduje, że musisz się dwa razy zastanowić, zanim to zrobisz. I w wielu przypadkach jest to dobra rzecz.
źródło
Zapewnia: 1) stałe odniesienie, np. Const x = [] - tablica może być modyfikowana, ale x nie może wskazywać innej tablicy; i 2) określanie zakresu bloków. const i niech razem zastąpią var w ecma6 / 2015 Zobacz dyskusję na https://strongloop.com/strongblog/es6-variable-declarations/
źródło
źródło
Po pierwsze, trzy przydatne rzeczy
const
(oprócz ulepszeń zakresu, którymi się dzielilet
):Twoje pytania:
Możesz to zrobić za każdym razem, gdy deklarujesz zmienną, której wartość nigdy się nie zmienia. To, czy uznasz to za właściwe, zależy wyłącznie od twoich preferencji / preferencji twojego zespołu.
To zależy od Ciebie / Twojego zespołu.
Tak:
var
iconst
mają różne reguły zakresu. (Być może chciał porównaćlet
zamiastvar
). W szczególności:const
alet
to blok o zakresie i, kiedy jest stosowany w zakresie globalnym, nie tworzyć właściwości dotyczące globalnego obiektu (choć robią tworzenia globalnych).var
ma albo zasięg globalny (gdy jest używany w zakresie globalnym), albo zasięg funkcji (nawet jeśli jest używany w bloku), a gdy jest używany w zakresie globalnym, tworzy właściwość na obiekcie globalnym.źródło
Semantyka
var
ilet
var
ilet
są instrukcją dla maszyny i innych programistów:Implikacje użycia
var
ilet
var
ilet
zmusić innych programistów do odczytania całego kodu pośredniczącego od deklaracji do ostatecznego użycia oraz uzasadnienia wartości przypisania w tym momencie wykonywania programu.Osłabiają one rozumowanie maszynowe dla ESLint i innych usług językowych w celu prawidłowego wykrywania błędnie wpisanych nazw zmiennych w późniejszych przypisaniach i ponownego użycia zakresu nazw zmiennych zewnętrznych, w przypadku gdy zasięg wewnętrzny zapomina się zadeklarować.
Powodują także, że środowiska wykonawcze uruchamiają wiele iteracji na wszystkich ścieżkach kodowych w celu wykrycia, że faktycznie są stałymi, zanim będą mogły je zoptymalizować. Chociaż jest to mniejszy problem niż wykrywanie błędów i zrozumiałość dla programistów.
Kiedy użyć
const
Jeśli wartość referencji nie zmienia się w trakcie wykonywania, poprawna składnia wyrażająca zamiary programisty to
const
. W przypadku obiektów zmiana wartości odniesienia oznacza wskazanie na inny obiekt, ponieważ odwołanie jest niezmienne, ale obiekt nie.const
obiekty „ ”W przypadku odniesień do obiektu wskaźnika nie można zmienić na inny obiekt, ale obiekt utworzony i przypisany do
const
deklaracji można modyfikować. Możesz dodawać lub usuwać elementy zconst
tablicy, do której istnieje odwołanie, oraz mutować klucze właściwości w obiekcie, do którego istniejeconst
odwołanie.Aby osiągnąć niezmienne obiekty (które ponownie ułatwiają zrozumienie kodu dla ludzi i maszyn), możesz
Object.freeze
obiekt w deklaracji / przypisaniu / tworzeniu, w następujący sposób:Object.freeze ma wpływ na wydajność, ale Twój kod jest prawdopodobnie powolny z innych powodów. Chcesz to profilować.
Możesz także enkapsulować obiekt zmienny w maszynie stanów i zwracać głębokie kopie jako wartości (tak działa stan Redux i React). Zobacz Unikanie zmiennego stanu globalnego w przeglądarce JS, aby dowiedzieć się, jak zbudować to na podstawie pierwszych zasad.
Kiedy
var
ilet
są dobrym dopasowaniemlet
ivar
reprezentują stan zmienny. Moim zdaniem powinny być używane tylko do modelowania rzeczywistego stanu zmiennego . Rzeczy takie jak „ czy połączenie jest żywe? ”.Najlepiej są one enkapsulowane w testowalnych maszynach stanów, które ujawniają stałe wartości, które reprezentują „ bieżący stan połączenia ”, który jest stały w dowolnym momencie, i czym tak naprawdę interesuje się reszta kodu.
Programowanie jest już wystarczająco trudne do komponowania efektów ubocznych i przekształcania danych. Przekształcenie każdej funkcji w maszynę stanu nie do przetestowania poprzez utworzenie stanu zmiennego ze zmiennymi tylko nakłada się na złożoność.
Aby uzyskać bardziej szczegółowe wyjaśnienie, zobacz Shun the Mutant - Case for
const
.źródło
„const” oznacza w kodzie, że identyfikator nie zostanie ponownie przypisany. To jest dobry artykuł o tym, kiedy użyć „const”, „let” lub „var” https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.ukgxpfhao
źródło
Nie jestem ekspertem w branży kompilacji JS, ale warto powiedzieć, że v8 korzysta z flagi const
Zwykle po zadeklarowaniu i zmianie szeregu zmiennych pamięć ulega fragmentacji, a v8 przestaje działać, zatrzymuje się na kilka sekund, aby wykonać gc lub wyrzucanie elementów bezużytecznych.
jeśli zmienna zostanie zadeklarowana za pomocą const v8, możesz mieć pewność, że umieści ją w ciasnym pojemniku o stałym rozmiarze między innymi zmiennymi const, ponieważ nigdy się nie zmieni. Może także zapisać prawidłowe operacje dla tych typów danych, ponieważ typ się nie zmieni.
źródło
Jeśli chodzi o decyzję między let i const , zawsze preferuj const, aby użycie było jasne w kodzie. W ten sposób, jeśli spróbujesz ponownie ustawić zmienną, pojawi się błąd. Jeśli nie ma innego wyjścia, jak to zmienić, po prostu zmień na let . Zauważ, że jak mówi Anthony , wartości nie są niezmienne (na przykład, obiekt const może mieć zmutowane właściwości).
Jeśli chodzi o var , ponieważ ES6 jest obecnie dostępny, nigdy nie użyłem go w kodzie produkcyjnym i nie mogę wymyślić dla niego przypadku użycia. Uważaj jednak, aby zmienne zadeklarowane za pomocą var nie miały zasięgu blokowego.
źródło