Ostatnio pisałem dużo kodu ES6 dla io.js. Na wolności nie ma zbyt wiele kodu do nauki, więc czuję, że definiuję własne konwencje.
Moje pytanie brzmi, kiedy w użyciu const
vs let
.
Stosowałem tę zasadę: Jeśli to możliwe, użyj const
. Używaj tylko, let
jeśli wiesz, że jego wartość musi się zmienić. (Zawsze możesz wrócić i zmienić a const
na a, let
jeśli później okaże się, że musisz zmienić jego wartość).
Głównym powodem tej reguły jest to, że łatwo ją konsekwentnie stosować. Nie ma szarych obszarów.
Chodzi o to, że kiedy stosuję tę zasadę, w praktyce 95% moich deklaracji to const
. I to wydaje mi się dziwne. Jestem tylko przy użyciu let
rzeczy jak i
w for
pętli, lub od czasu do czasu na takie rzeczy jak skumulowane sumy Fibonacciego (który nie pojawia się wiele w życiu). Zaskoczyło mnie to - okazuje się, że 95% „zmiennych” w moim kodzie ES5 do tej pory dotyczyło wartości, które się nie zmieniają. Ale widzenie const
całego mojego kodu wydaje się jakoś źle.
Moje pytanie brzmi: czy można const
tak często korzystać? Czy naprawdę powinienem robić takie rzeczy const foo = function () {...};
?
A może powinienem zarezerwować const
na takie sytuacje, w których kodujesz literał na samym szczycie modułu - na przykład w przypadku wielkich liter const MARGIN_WIDTH = 410;
?
źródło
const
tego jest w porządku .function foo() {...}
jest lepszy niż<anything> foo = function() {...}
function foo() {...}
może powodować niewielkie zamieszanie podczas debugowania z powodu podnoszenia. Ponadto jego istnienie oznacza, że mamy dwie konstrukcje, które robią to samo, ale jedna z nich działa tylko w bardzo specyficznym kontekście. (Możesz użyć wyrażenia funkcyjnego wszędzie tam, gdzie istnieje wyrażenie, ale możesz użyć deklaracji funkcji tylko na poziomie instrukcji.) Jeśli wolisz zwięzłość, problemem może być to, że składnia wyrażenia funkcyjnego używa całego słowafunction
.Odpowiedzi:
Moja odpowiedź tutaj nie jest związana z javascript.
Jako ogólną zasadę w każdym języku, który pozwala mi to zrobić w pół-łatwy sposób, powiedziałbym, że zawsze używaj const / final / readonly / cokolwiek to się nazywa w twoim języku, kiedy tylko jest to możliwe. Powód jest prosty, o wiele łatwiej jest wnioskować o kodzie, gdy nie wiadomo, co można zmienić, a co nie. Oprócz tego w wielu językach można uzyskać pomoc techniczną, która mówi, że robisz coś złego, gdy przypadkowo przypisujesz zmienną, którą zadeklarowałeś jako const.
Cofanie się i zmiana stałej na let jest bardzo proste. A przejście do trybu domyślnego powoduje, że musisz się dwa razy zastanowić. I w wielu przypadkach jest to dobra rzecz.
Ile widziałeś błędów, które powodowały nieoczekiwane zmiany zmiennych? Chyba dużo. Wiem, że większość błędów, które widzę, obejmują nieoczekiwane zmiany stanu. Nie pozbędziesz się tych wszystkich błędów, swobodnie używając const, ale pozbędziesz się ich wszystkich!
Ponadto wiele języków funkcjonalnych ma niezmienne zmienne, w których wszystkie zmienne są domyślnie stałe. Spójrz na przykład na Erlang lub F #. Kodowanie bez przypisania działa idealnie w tych językach i jest jednym z wielu powodów, dla których ludzie kochają programowanie funkcjonalne. Z tych języków można się wiele nauczyć na temat zarządzania stanem, aby zostać lepszym programistą.
A wszystko zaczyna się od bycia wyjątkowo liberalnym z Const! ;) To tylko dwa znaki do napisania w porównaniu do let, więc śmiało i tak dalej
const
!źródło
const
to dwie kolejne postacie niżlet
...val
w Scali (która deklaruje zmienną jako niezmienną) i używaniavar
(mutable odpowiednika) tylko wtedy, gdy nie możemy użyćval
. Innymi słowy, deklarujemy zmienne jako domyślnie niezmienne i wprowadzamy zmienność tylko wtedy, gdy jest to absolutnie potrzebne (co może być po prostu spowodowane tym, że zmienne podejście jest czystsze).Uważaj, ponieważ
const
klucze obiektów można modyfikować.Stąd: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
rozważ ten przykład:
To samo dotyczy tablic:
Nie zdecydowałem się całkowicie sam, ale rozważam użycie
const
wszystkich obiektów nie-tablicowych / innych niż obiektowe i użycialet
dla obiektów / tablic.źródło
const
.colors = numbers
nie będzie działać zgodnie z oczekiwaniami. Jeśli chcesz chronić swoje właściwości obiektu, możesz użyćObject.freeze()
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…const moment = require('moment')
, chyba że jesteś osobą, która martwi się, że ktoś spróbuje to zrobićmoment = dead.fish(() => pizza)
później.moment = Date.now()
. Ale w każdym razie, jeśli kod zakłada niezmiennik, nie widzę nic złego w egzekwowaniu go w miarę możliwości.Nie martw się o to.
const
jest niesamowitym dodatkiem do JavaScript i polecam używać go we wszystkich miejscach, które ma sens. To sprawia, że kod jest bardziej niezawodny.Jeśli chodzi o obiekty,
const
będzie chronić twoją zmienną przed ponownym przypisaniem, ale jeśli potrzebujesz niezmiennych obiektów, będziesz potrzebowaćObject.freeze
metody, patrz poniżej.const
ochroni tylko przed ponownym przypisaniem, afreeze
metoda ochroni wszystkie bezpośrednie właściwości. Jeśli wszystkie zagnieżdżone właściwości również są niezmienne, musiszfreeze
je rekurencyjnie .źródło
Object.freeze
jest płytki.W moim ES6
const
nie chodzi o post niezmienności , wyjaśniam, coconst
dokładnie znaczy zgodnie ze specyfikacją.W oparciu o te obiektywne fakty, oto moje osobiste preferencje:
Może to być subiektywne, ale faktem jest, że to najbardziej pasuje do intencji specyfikacji.
Ludzie, którzy używają
let
domyślnie zwykle traktująconst
zmienne jako stałe (które niekoniecznie są z założenia!). Dla każdego z nich, ale wolę używać rzeczy zgodnie z ich przeznaczeniem, a nie dla niektórych wymyślonych znaczeń, które ludzie przypisują temu na podstawie nieporozumienia.Używanie
const
tylko do stałych jest jak używanie elementu HTML<aside>
tylko do zawartości paska bocznego.źródło
const
jeśli nie jest stałe?const
jest. Czy przeczytałeś powyższe?const
jest to, że się nazywaconst
. To głupie imię (w javascript), które na początku dezorientuje wielu (wszystkich?) Programistów. IMO lepiej byłoby, gdybyconst
został powołanylet
(zwłaszcza dlatego, żelet
jest krótszy, aleconst
jest znacznie bardziej powszechny) ilet
nazwany czymś innym.Moje osobiste podejście, pomyślane o pomocy w czytaniu i zrozumieniu kodu:
let
jest tylko dla zmiennych krótkotrwałych, zdefiniowanych w jednym wierszu i nie zmienianych później. Zasadniczo te zmienne, które są tylko po to, by zmniejszyć ilość pisania. Na przykład:const
dla wszystkich nazw znanych jako stałe w całym module. Bez uwzględnienia lokalnych wartości stałych. Navalue
przykład powyższy przykład ma stały zasięg i może być zadeklarowany za pomocąconst
, ale ponieważ istnieje wiele iteracji i dla każdej z nich istnieje wartość o tej samej nazwie „wartość”, która może skłonić czytelnika do myślenia, żevalue
zawsze jest to samo. Moduły i funkcje są najlepszym przykłademconst
zmiennych:var
za wszystko, co może być zmienne. Nazwy, które mogą mylić osoby czytające kod, nawet jeśli są stałe lokalnie i nie są odpowiednielet
(tj. Nie są wypełnione w prostej deklaracji bezpośredniej), ubiegają się o deklarację za pomocąvar
. Na przykład:Dalsze komentarze i możliwe przyszłe aktualizacje tutaj .
źródło
JavaScript jest trochę wyjątkowy, ponieważ zmienne mogą być funkcjami i takimi, ale weź pod uwagę C #, Java lub inny podobny język w stylu C:
Jest
const
to dziwne, a to dlatego, że deklaracje metod w tych językach nie mogą się zmienić, gdy zostaną one skompilowane w coś innego, to jest to, co robią, bez względu na wszystko (ignorując niektóre okropne hacki, które mogą istnieć).Dlaczego JavaScript powinien być inny? Więc nie jest skompilowany, ale to nie znaczy, że powinniśmy porzucić bezpieczeństwo, które kompilatory mogą zapewnić. Użycie
const
słowa kluczowego zapewnia nam większe bezpieczeństwo, co z pewnością doprowadzi do bardziej niezawodnych aplikacji.źródło