Czy istnieje sposób na użycie stałych w JavaScript ?
Jeśli nie, jaka jest powszechna praktyka określania zmiennych, które są używane jako stałe?
javascript
constants
fuentesjr
źródło
źródło
Chrome
pozwala używać słowa kluczowegoconst
do używania stałych. npconst ASDF = "asdf"
. Ponieważ jednakconst
nie jest kompatybilny z wieloma przeglądarkami, zwykle trzymam sięvar
deklaracji.try{const thing=1091;}catch(e){var thing=1091;}
Pracuje.const
czyvar
w ogóle?const
ma taki sam zakres jakvar
i to jest na poziomie funkcji, a nie na poziomie bloku. Jeśli zamiast tego postępujesz zgodnie z nadchodzącym standardem ECMAScript,const
ma on taki sam zakreslet
, co oznacza, że nie będzie działać.Odpowiedzi:
Od wersji ES2015 JavaScript ma pojęcie
const
:Będzie to działać prawie we wszystkich przeglądarkach oprócz IE 8, 9 i 10 . Niektóre mogą również wymagać włączenia trybu ścisłego .
Możesz używać
var
konwencji takich jak ALL_CAPS, aby pokazać, że niektóre wartości nie powinny być modyfikowane, jeśli potrzebujesz obsługi starszych przeglądarek lub pracujesz ze starszym kodem:źródło
const
słowa kluczowego. Jest obecnie obsługiwany przez wszystkie nowoczesne przeglądarki oprócz IE.Object.defineProperty
do tworzenia właściwości tylko do odczytu, których również nie można usunąć. Działa to w bieżącej wersji wszystkich głównych przeglądarek (ale niepoprawnie w IE8 ). Zobacz odpowiedź @NotANameconst
kluczowe jest teraz oficjalnie częścią języka i jest obsługiwane przez każdą przeglądarkę. Według statcounter.com tylko kilka procent internautów nadal korzysta ze starych wersji przeglądarki, które nie były obsługiwaneconst
.Czy próbujesz zabezpieczyć zmienne przed modyfikacją? Jeśli tak, możesz użyć wzorca modułu:
Przy takim podejściu wartości nie mogą być modyfikowane. Ale musisz użyć metody get () na CONFIG :(.
Jeśli nie musisz ściśle chronić wartości zmiennych, postępuj zgodnie z sugestią i stosuj konwencję WSZYSTKICH KAPS.
źródło
CONFIG.get = someNewFunctionThatBreaksTheCode
... Podsumowując, absolutnie nie można wymuszać stałych w JS (bez słowa kluczowego const). Jedyne, co możesz zrobić, to ograniczyć widoczność.private
jest to zastrzeżone słowo na przyszłość w JavaScript, nie użyłbym tego, gdybym był tobą.Słowo
const
kluczowe znajduje się w wersji roboczej ECMAScript 6, ale jak dotąd cieszy się tylko odrobiną obsługi przeglądarki: http://kangax.github.io/compat-table/es6/ . Składnia jest następująca:źródło
const
, nie spowoduje to żadnych błędów. Przypisanie po prostu kończy się niepowodzeniem, a stała wciąż ma swoją pierwotną wartość. Jest to poważna wada projektowa IMHO, ale dopóki istnieje jasna, spójna konwencja nazewnictwa (taka jak popularna ALL_CAPS), nie sądzę, że spowodowałaby to zbyt wiele smutku.'use strict'
.ALL CAPS
?Zobacz Object.freeze . Możesz użyć,
const
jeśli chcesz, abyconstants
odwołanie było również tylko do odczytu.źródło
i
const
deklaracji ES6 , np. Właściwości nie można ponownie zadeklarować ani ponownie przypisać, ale jeśli są one typu danychobject
, można je mutować.const constants
zamiast,var constants
aby zapobiec zmianie przypisania zmiennej.IE obsługuje stałe, takie jak np .:
źródło
const
). Czy możesz wyjaśnić, co jest z tym nie tak?ECMAScript 5 wprowadza
Object.defineProperty
:Jest obsługiwany w każdej nowoczesnej przeglądarce (a także IE ≥ 9).
Zobacz także: Object.defineProperty w ES5?
źródło
writable: false
spowoduje błąd, jeśli kod wykonujący przypisanie jest interpretowany w trybie ścisłym ECMAScript 5. To kolejny powód, dla którego warto pisać'use strict'
w swoim kodzie.writable: false
ponieważ jest to ustawienie domyślne .Nie, ogólnie nie. Firefox implementuje,
const
ale wiem, że IE nie.@John wskazuje na powszechną praktykę nazewnictwa stałych, która była używana od lat w innych językach, nie widzę powodu, dla którego nie mogłeś tego użyć. Oczywiście nie oznacza to, że ktoś i tak nie napisze wartości zmiennej. :)
źródło
W JavaScript wolę używać funkcji do zwracania stałych wartości.
źródło
Dokumenty sieciowe Mozillas MDN zawierają dobre przykłady i wyjaśnienia
const
. Fragment:Smutne jest jednak to, że IE9 / 10 nadal nie obsługuje
const
. A powodem tego jest absurd :Nie implementują go, ponieważ inne przeglądarki nie implementowały go poprawnie ?! Zbyt boisz się, że będzie lepiej? Definicje standardów czy nie, stała jest stałą: ustawiana raz, nigdy nie zmieniana.
I do wszystkich pomysłów: każdą funkcję można zastąpić (XSS itp.). Więc nie ma różnicy w
var
lubfunction(){return}
.const
jest jedyną prawdziwą stałą.Aktualizacja: IE11 obsługuje
const
:źródło
Jeśli nie masz nic przeciwko korzystaniu z funkcji:
Takie podejście oferuje funkcje zamiast zwykłych zmiennych, ale gwarantuje *, że nikt nie może zmienić wartości po jej ustawieniu.
Osobiście uważam to raczej za przyjemne, szczególnie po przyzwyczajeniu się do tego wzoru z nokautowych obserwowalności.
* Chyba że ktoś przedefiniował funkcję
constant
przed jej wywołaniemźródło
a = constant(10); a(10); // 10
po nima = constant(25); a(); //25
nie podano żadnych błędów ani ostrzeżeń, brak wskazania, że stała została zerwana.a
wówczas zmieni się ona na nową wartośćdzięki „nowemu” obiektowemu interfejsowi API możesz zrobić coś takiego:
spójrz na to w Mozilla MDN, aby uzyskać więcej szczegółów. Nie jest to zmienna pierwszego poziomu, ponieważ jest dołączona do obiektu, ale jeśli masz zakres, cokolwiek, możesz do niego dołączyć.
this
powinien również działać. Na przykład zrobienie tego w zakresie globalnym zadeklaruje pseudo-stałą wartość w oknie (co jest naprawdę złym pomysłem, nie należy beztrosko deklarować globalnych zmiennych)Uwaga: przypisanie zwróci ci przypisaną wartość w konsoli, ale wartość zmiennej się nie zmieni
źródło
Grupuj stałe w struktury tam, gdzie to możliwe:
Przykład: w moim obecnym projekcie gry wykorzystałem poniżej:
Zadanie:
Porównanie:
Ostatnio używam do porównania:
IE11 ma nowy standard ES6, który ma deklarację „const”.
Powyższe działa we wcześniejszych przeglądarkach takich jak IE8, IE9 i IE10.
źródło
Możesz łatwo wyposażyć skrypt w mechanizm stałych, które można ustawiać, ale nie zmieniać. Próba ich zmiany spowoduje błąd.
źródło
Zapomnij o IE i użyj
const
słowa kluczowego.źródło
Jednak nie ma dokładnie określonego sposobu, aby to zrobić w różnych przeglądarkach, można to osiągnąć, kontrolując zakres zmiennych, jak pokazano w innych odpowiedziach.
Ale zasugeruję użycie przestrzeni nazw w celu odróżnienia od innych zmiennych. zmniejszy to do minimum prawdopodobieństwo kolizji z innymi zmiennymi.
Właściwa przestrzeń nazw jak
więc podczas korzystania będzie
iw_constant.name
lubiw_constant.age
Możesz także zablokować dodawanie nowego klucza lub zmianę dowolnego klucza wewnątrz iw_constant przy użyciu metody Object.freeze. Jednak nie jest obsługiwany w starszej przeglądarce.
dawny:
W starszych przeglądarkach można użyć metody polyfill do zamrożenia.
Jeśli nie masz nic przeciwko funkcji wywoływania, najlepszym sposobem zdefiniowania stałej jest najlepsza przeglądarka internetowa. Określanie zakresu obiektu w ramach funkcji wykonującej się samoczynnie i zwracanie funkcji get dla stałych np.
// aby uzyskać wartość użyj
iw_constant('name')
lubiw_constant('age')
** W obu przykładach należy bardzo uważać na odstępy między nazwami, aby nie zastąpić obiektu lub funkcji inną biblioteką (jeśli sam obiekt lub funkcja zostaną zastąpione, cała stała zostanie zmieniona)
źródło
Przez jakiś czas podałem „stałe” (które wciąż nie były stałymi) w literałach obiektowych przekazywanych do
with()
instrukcji. Myślałem, że to takie sprytne. Oto przykład:W przeszłości utworzyłem również
CONST
przestrzeń nazw, w której umieściłem wszystkie moje stałe. Ponownie, z kosztami ogólnymi. Do licha.Teraz, po prostu zrobić
var MY_CONST = 'whatever';
na KISS .źródło
with
.Moja opinia (działa tylko z obiektami).
Próbować! Ale zrozum - to obiekt, ale nie prosta zmienna.
Spróbuj także:
źródło
Ja też miałem z tym problem. Po dłuższej chwili szukania odpowiedzi i analizowania wszystkich odpowiedzi wydaje mi się, że znalazłem realne rozwiązanie tego problemu.
Wygląda na to, że większość odpowiedzi, na które natrafiłem, wykorzystuje funkcje do przechowywania stałych. Jak wielu użytkowników forów WIELU forów pisze, funkcje mogą być łatwo nadpisane przez użytkowników po stronie klienta. Zaintrygowała mnie odpowiedź Keitha Evettsa, że do obiektu stałych nie można uzyskać dostępu z zewnątrz, ale tylko z funkcji wewnątrz.
Wymyśliłem więc to rozwiązanie:
Umieść wszystko w anonimowej funkcji, aby zmienne, obiekty itp. Nie mogły zostać zmienione po stronie klienta. Ukryj także „rzeczywiste” funkcje, ponieważ inne funkcje wywołują „rzeczywiste” funkcje od wewnątrz. Pomyślałem także o użyciu funkcji do sprawdzenia, czy funkcja została zmieniona przez użytkownika po stronie klienta. Jeśli funkcje zostały zmienione, zmień je z powrotem za pomocą zmiennych, które są „chronione” wewnątrz i nie można ich zmienić.
Wydaje się również, że bezpieczeństwo jest naprawdę problemem i nie ma sposobu, aby „ukryć” swoje programowanie po stronie klienta. Dobrym pomysłem jest dla mnie skompresowanie twojego kodu, aby naprawdę trudno było go przeczytać i zrozumieć każdemu, włączając ciebie, programistę. Istnieje strona, na którą możesz przejść: http://javascriptcompressor.com/ . (To nie jest moja strona, nie martw się, nie reklamuję się.) To jest strona, która pozwoli ci kompresować i zaciemniać kod JavaScript za darmo.
źródło
Wyraźnie pokazuje to potrzebę znormalizowanego słowa kluczowego const dla różnych przeglądarek.
Ale teraz:
lub
Oba wydają się wystarczające, a wszystko inne przypomina strzelanie do muchy za pomocą bazooki.
źródło
Używam
const
zamiastvar
w moich skryptach Greasemonkey, aledzieje się tak dlatego, że będą działały tylko w przeglądarce Firefox ... Konwencja nazw może być naprawdę dobrym rozwiązaniem (robię oba!).
źródło
W JavaScripcie moją praktyką było unikanie stałych w jak największym stopniu i zamiast tego używanie ciągów. Problemy ze stałymi pojawiają się, gdy chcesz wystawić swoje stałe na świat zewnętrzny:
Na przykład można zaimplementować następujący interfejs API Data:
Ale o wiele krótsze i bardziej naturalne jest napisanie:
W ten sposób „dni” i „godziny” naprawdę działają jak stałe, ponieważ nie można zmienić z zewnątrz, ile sekund reprezentuje „godzina”. Ale łatwo go zastąpić
MyModule.Date.HOUR
.Takie podejście pomoże również w debugowaniu. Jeśli Firebug powie Ci,
action === 18
że ciężko jest zrozumieć, co to znaczy, ale kiedy zobaczyszaction === "save"
, natychmiast będzie jasne.źródło
"Hours"
Zamiast"hours"
- ale IDE może wcześnie dać ci znać, żeDate.Hours
nie jest zdefiniowane.Okej, to jest brzydkie, ale daje mi stałą w Firefoksie i Chromium, niestałą stałą (WTF?) W Safari i Operze oraz zmienną w IE.
Oczywiście eval () jest złem, ale bez niego IE generuje błąd, uniemożliwiając uruchamianie skryptów.
Safari i Opera obsługują słowo kluczowe const, ale można zmienić jego wartość .
W tym przykładzie kod po stronie serwera zapisuje JavaScript na stronie, zastępując {0} wartością.
Do czego to służy? Niewiele, ponieważ nie jest to przeglądarka. W najlepszym razie może trochę spokoju, że przynajmniej niektóre przeglądarki nie pozwalają bookmarkletom ani skryptowi innej firmy modyfikować wartość.
Testowane z Firefox 2, 3, 3.6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9.
źródło
Jeśli warto wspomnieć, można zdefiniować stałe za pomocą kątownika
$provide.constant()
źródło
Ulepszona wersja odpowiedzi Burke'a, która na to pozwala
CONFIG.MY_CONST
zamiastCONFIG.get('MY_CONST')
.Wymaga IE9 + lub prawdziwej przeglądarki internetowej.
* Właściwości są tylko do odczytu, tylko jeśli wartości początkowe są niezmienne.
źródło
JavaScript ES6 (ponownie) wprowadził
const
słowo kluczowe, które jest obsługiwane we wszystkich głównych przeglądarkach .Poza tym
const
zachowuje się podobnie dolet
.Zachowuje się zgodnie z oczekiwaniami dla prymitywnych typów danych (logiczna, zerowa, niezdefiniowana, liczba, łańcuch, symbol):
Uwaga: należy pamiętać o pułapkach związanych z obiektami:
Jeśli naprawdę potrzebujesz niezmiennego i absolutnie stałego obiektu: po prostu użyj,
const ALL_CAPS
aby wyrazić swoją intencję. Jest to dobra konwencja do przestrzegania wszystkichconst
deklaracji, więc polegaj na niej.źródło
Inną alternatywą jest coś takiego:
Następnie po prostu:
var foo = constantMap.MY_CONSTANT
Gdybyś
constantMap.MY_CONSTANT = "bar"
to zrobił, nie przyniosłoby to żadnego efektu, ponieważ próbujemy użyć operatora przypisania z modułem pobierającym, dlategoconstantMap.MY_CONSTANT === "myconstant"
pozostałoby to prawdą.źródło
w Javascript już istnieją stałe . Definiujesz stałą w ten sposób:
Nie można tego zmienić poprzez zmianę przypisania.
źródło
Słowo kluczowe „const” zostało zaproponowane wcześniej i teraz zostało oficjalnie włączone do ES6. Używając słowa kluczowego const, możesz przekazać wartość / ciąg znaków, który będzie działał jako ciąg niezmienny.
źródło
Wprowadzenie stałych do JavaScript to w najlepszym wypadku hack.
Dobrym sposobem tworzenia trwałych i globalnie dostępnych wartości w JavaScript byłoby zadeklarowanie literału obiektu z pewnymi właściwościami „tylko do odczytu”, takimi jak:
będziesz mieć wszystkie swoje stałe zgrupowane w jednym „dodatkowym” obiekcie pomocniczym, w którym możesz szukać przechowywanych wartości lub czegokolwiek innego, co mógłbyś tam umieścić w tym celu. Teraz sprawdźmy, czy to działa:
Jak widać, właściwość „my.constant1” zachowała swoją pierwotną wartość. Zrobiłeś sobie miłe „zielone” stałe tymczasowe ...
Ale to oczywiście ochroni cię tylko przed przypadkową modyfikacją, zmianą, unieważnieniem lub opróżnieniem stałej wartości nieruchomości z bezpośrednim dostępem, jak w podanym przykładzie.
W przeciwnym razie nadal uważam, że stałe są dla manekinów. Nadal uważam, że wymiana waszej wielkiej wolności na mały kłamstwo oszukańczego bezpieczeństwa to najgorszy możliwy handel.
źródło
Rhino.js
wdrażaconst
oprócz tego, co wspomniano powyżej.źródło