2012-02-20 9 views
11

W JavaScript można zdefiniować obiekt tak:Reguły niecytowanych kluczy literackich obiektu JavaScript?

var d = {1: 'test'}; 

i mogę ustawić klucz z ujemnym wskaźnikiem numer jak ten:

d[-1] = 'test2'; 

ale gdy próbuję użyć liczby ujemnej w literalnej inicjalizacji pojawia się błąd:

var d = {1: 'test', -1: 'test2'}; 
Uncaught SyntaxError: Unexpected token - 

Dlaczego tak jest? Dlaczego nie mogę użyć literalnej liczby ujemnej jako klucza do obiektu? Czy istnieje obejście, które pozwala mi na zainicjowanie go jako literału. Wiem, że zamiast tego mógłbym użyć ciągów, ale chcę używać liczb całkowitych.

+0

użytku cudzysłowy wokół nazwy właściwości jak „-1”: „test2” –

Odpowiedz

15

Od Unquoted property names/object keys in JavaScript mój write-up na temat:

Quotes can only be omitted if the property name is a numeric literal or a valid identifier name .

[…]

Bracket notation can safely be used for all property names.

[…]

Dot notation can only be used when the property name is a valid identifier name.

-1 nie jest numeryczny dosłowny, to jednoskładnikowa - operator następnie dosłownym numerycznej (1).

Zrobiłem też narzędzie, które powie Ci, czy dana nazwa nieruchomości może być używana bez cudzysłowu i/lub z notacją kropkową. Wypróbuj go pod adresem mothereff.in/js-properties.

Screenshot

+0

Myślę, że miałeś na myśli" unarny operator '-'." –

+0

@GGG Napis na klawiaturze, dzięki! –

+0

Twoje narzędzie twierdzi, że '-1' i' + 1' mogą być używane jako niecytowane nazwy właściwości, nawet jeśli faktycznie nie działają. –

3

To dlatego, że -1 nie jest poprawnym identyfikatorem zmiennej.

+0

Ale nadal mogę przypisać go przez klucz później, więc jest to ograniczenie składni dosłownym że klucze muszą być poprawne nazwy zmiennych ? – jterrace

+0

Prawidłowo. to tylko reprezentacja obiektu hte. –

+3

@jterrace, @Daniel: Nazwy właściwości w inicjalizatorach obiektów mogą być również literałami łańcuchowymi i literałami numerycznymi (nie tylko nazwy identyfikatorów). Ale najwyraźniej "-1" nie jest literałem numerycznym: http://es5.github.com/#x7.8.3 –

3

zmienić na

var d = { 1: 'test', '-1': 'test2'}; 

Identyfikatory, które są wyszukiwane lub nie może być normalny identyfikator z innych powodów, mogą być nadal używane, jeżeli w cudzysłowie.

+0

'1' nie może być użyty jako identyfikator ... po prostu mówiąc;) –

1

nie jestem pewien dokładnie dlaczego, ale trzeba podać liczbę ujemną w inicjatora obiektu:

var d = {1: 'test', '-1': 'test2'}; 

Wszystko przedmiot klucze są traktowane jako ciągi wewnętrznie, dzięki czemu można rozwiązać ten klucz przy użyciu:

d[-1] or d['-1'] 
4

Interesujące pytanie.

Rzecz w tym, że nie ma różnicy między wpisując

var d = {24: 'foo'}; 

i

var d = {"24": 'foo'}; 

Można to sprawdzić wykonując:

var d = {24:'foo', "24":'bar'}; 

zauważyć, że ma jedną „24 tylko "właściwość (i kończy się niepowodzeniem w trybie ścisłym).

Podczas gdy nie wyjaśnia to, dlaczego nie można wykonać -1 bez cudzysłowu, miejmy nadzieję, że wyjaśnia to, że "-1" jest równie dobre.

Co ciekawe, niecytowane liczby ułamkowe działają dobrze.

Edytuj: Felix Kling wyjaśnia, dlaczego nie działa w komentarzu do innej odpowiedzi. -1 nie jest literałem numerycznym, jest wyrażeniem z literałem liczbowym i unarnym operatorem - - dlatego nie nadaje się jako klucz obiektowy.