33

Czy jako nazwę właściwości obiektu można użyć reserved word?używając słów zastrzeżonych jako nazw właściwości, ponownie odwiedzono

Ten problem został zgłoszony pośrednio poprzednio pod numerem stackoverflow question. Odpowiedź wydawała ogólny konsensus przez @Squeegy:

Można użyć tych słów, ale tylko jako ciągi, a nie właściwości skrót - foo["class"] jest cool, natomiast foo.class nie jest
pomocny dając linka do list of reserved words

natomiast myślę, że @ Squeeky jest prawdopodobnie bardziej kompetentny niż ja w tej dziedzinie i to chyba zły pomysł używać słów zastrzeżonych w niektórych sytuacjach, myślę, że jego wniosek jest niewłaściwy w oparciu o dwa punkty:

  • testowania słów zastrzeżonych używanie ich jako "skróconych" właściwości

  • HTMLFormElement uniemożliwia nie używać słów zastrzeżonych w „skrót”

Po pierwsze, przy użyciu zastrzeżonego listę słów, z których każdy został dodany jako właściwość do Object i HTMLElement, zarówno jako obj["word"] i obj.word, a następnie pobrane jako obj["word"] i obj.word. W każdym z 63 przypadków wszystkie osiem testów działało poprawnie.

Po drugie, HTMLFormElement wymaga tego, ponieważ pobiera w swoich elementach za pomocą notacji skróconej. Jeśli <input name='typeof' value='scalar' /> jest elementem formularza, to form.typeof == "skalarny".

Z mojego doświadczenia wynika, że ​​słowa zastrzeżone to zazwyczaj dane (np. Kolumna "prywatna"), a nie program. Jako takie zanieczyszczają obiekty JSON, a stamtąd INPUT, a stamtąd HTMLFormElement. Mówiąc prosto, bez dużej ilości (niepotrzebnych) prac, niemożliwe jest zachowanie zastrzeżonych słów , a nie, które są zmuszane do poprawnej pracy w skrócie.

Wydaje mi się te prawdziwe problemy:

  • opieka musi być nie podjęte w sprzeczności z istniejącymi właściwości, a nie słowa zastrzeżone

  • (wielu, jeśli nie wszystkich) zmienne nie może być zarezerwowane słowa

  • użycie zarezerwowanych słów, ponieważ właściwości mogą być (ale niekoniecznie) wprowadzają w błąd

Czy ten wniosek poprawny wówczas, że zarezerwowane słowa jako nazwy własności, a dostęp do nich zarówno jako ciągi lub skrót, jest po prostu w porządku - tak długo, jak trochę zdrowego rozsądku jest stosowany do sytuacji?

+0

Co to znaczy 'form.typeof '? Mam na myśli, jak to jest związane z HTMLFormElement? Właściwość obiektu JS można uzyskać na co najmniej dwa sposoby '['prop']' oraz z notacją kropkową '.prop'. A to nie ma nic wspólnego z HTMLFormElement lub DOM API lub czymkolwiek innym. 'form ['typeof']' jest absolutnie normalne – user907860

Odpowiedz

38

W ECMAScript, począwszy od ES5, zastrzeżone słowa mogą być używane jako nazwy właściwości obiektu „w buff”. Oznacza to, że nie muszą być "ubrani" w cudzysłowy przy definiowaniu literałów obiektów i można je dereferencjonować (do uzyskiwania dostępu, przypisywania i usuwania) na obiektach bez konieczności stosowania notacji indeksowania z nawiasami kwadratowymi.

Wymienione słowa zastrzeżone mogą nadal być używane jako nazwy identyfikatorów. Ma to dość jednoznacznie w specyfikacji i stwierdzono nieco dobitnie tutaj (jeśli nie chcesz, aby Twoje oczy krwawią przez konieczności zapoznania się z rzeczywistą specyfikację języka) ...

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Reserved_Words

Poniższy są słowami kluczowymi i nie mogą być wykorzystywane jako zmienne, funkcji, metod, lub identyfikatorów obiektów, ponieważ ECMAScript określa szczególne zachowanie do nich:

+0

Jak możemy zminimalizować skrypty takie jak bootstrap_multiselect.js, które używają konstruktów takich jak $ tag = $ ('

+0

* słowa zastrzeżone NIE mogą być nadal używane jako ** nazwy identyfikatorów ***. Miałeś na myśli ** identyfikatory **? Ponieważ z tego, co przeczytałem tutaj i na stronie połączonej, wygląda na to, że mogą one być używane jako nazwy identyfikatorów (IdentifierNames), a nie jako identyfikatory. – user907860

+0

"_ReservedWord_ jest wyliczonym podzestawem _IdentifierName_. Gramatyka syntaktyczna definiuje _Identyfikator_ jako _Naznaczenie_identyfikatora_, który nie jest _ReservedWord_". Czyste jak błoto. [źródło] (http://www.ecma-international.org/ecma-262/7.0/index.html#sec-names-and-keywords) –

6

Nie jestem do końca pewien, o co chodzi, dlatego jedyną możliwą odpowiedzią jest: Tak, można używać zastrzeżonych słów jako nazw właściwości.

(Jednak dwie małe uwagi: foo["class"] jest ok, nie foo[class].I sposób należy używać form.elements["xyz"] i nie form.xyz aby uzyskać dostęp do elementu o nazwie xyz.)

+2

_absolutnie_ zgadzam się na używanie 'form.elements ['abc']' zamiast 'form.abc' - ale punktem jest przeglądarka javascript z definicji obsługuje' form.abc'. naprawiono literówkę powyżej. przez google i jakość, stackoverflow staje się wysoko cenionym odniesieniem. kiedy się odwołałem, nie miało sensu, więc "staram się ustalić rekord" - i myślę, że mogę się mylić. –

+0

Implementacja mechanizmu JavaScript w wersji innej niż JSR223 działa w ten sposób, gdy skrypt generuje wyjątek JavaException. Jeśli potrzebujesz specjalnej logiki, aby go obsłużyć, musisz sprawdzić wyjątek wyjątek.javaException ["class"] .name, aby sprawdzić, czy pasuje do nazwy klasy Java konkretnego wyjątku, którego szukasz. – sworisbreathing

+0

Dlaczego powinieneś używać 'foo [" xyz "]' over 'foo.xyz'? Nie widzę powodu, by faworyzować jedną nad drugą. Pierwsza z nich po prostu dodaje dużo szumu i jest przydatna tylko wtedy, gdy używasz słowa zarezerwowanego lub zmiennej jako klucza. – cdmckay

3

Tak, to może być używany.

Wystarczy mała uwaga, jeśli używasz kompresora YUI, musisz umieścić nazwę właściwości równą jednemu z js słów zarezerwowanych w cudzysłowach.

Na przykład, nie będzie to skompresować

var a = { case : "foo"}; // syntax error, "invalid property id" 
a.for = "bar"; // syntax error, "missing name after . operator" 

Będzie to zrobić

var a = { "case" : "foo"}; //OK 
a["for"] = "bar"; //OK 

Oto Online JavaScript/CSS Compression Using YUI Compressor gdzie to może być testowany.

Powiązane problemy