Jaka jest różnica między kluczami obiektowymi z cudzysłowami i bez cudzysłowów?

209

Czy jest jakaś różnica między

obj = {'foo': 'bar'} 

i

obj = {foo: 'bar'}

Zauważyłem, że nie można użyć -klucza, gdy nie używam cytatów. Ale czy to rzeczywiście robi różnicę? Jeśli tak to jakie?

meo
źródło

Odpowiedzi:

136

Nie, cytaty nie mają znaczenia (chyba że, jak zauważyłeś, chcesz użyć klucza, który nie jest prawidłowym identyfikatorem JavaScript).

Jako marginesie, JSON format wymiany danych nie wymagają cudzysłowie identyfikatorów (ani nie pozwolić apostrofów).

bdukes
źródło
88
W rzeczywistości cytaty mogą mieć znaczenie, jeśli użyjesz literału liczbowego jako nazwy właściwości. Na przykład obj = { 12e34: true };to nie to samo co obj = { '12e34': true };. Pierwszy z nich wymagałby dostępu do nieruchomości przez obj['1.2e+35'], podczas gdy drugi byłby używany obj['12e34']. Zobacz moją odpowiedź, aby uzyskać więcej informacji.
Mathias Bynens
1
To prawda, ale byłoby wspaniale, gdyby podwójne cudzysłowy były opcjonalne, biorąc pod uwagę pierwszy znak az + cyfrę i czy może niektórzy fani białych znaków, czyli niewidoczne spacje lub tabulatory? idealne dla danych, które nie są głęboko zagnieżdżone.
Jason Sebring
124

Z niecytowanych nazw właściwości / kluczy obiektów w JavaScript , mój komentarz na ten temat:

Cytaty można pominąć tylko wtedy, gdy nazwa właściwości jest literałem numerycznym lub prawidłową nazwą identyfikatora .

[…]

Notację w nawiasach można bezpiecznie stosować dla wszystkich nazw właściwości.

[…]

Notacji kropkowej można używać tylko wtedy, gdy nazwa właściwości jest prawidłową nazwą identyfikatora.

Należy pamiętać, że zastrzeżone słowa mogą być używane jako niecytowane nazwy właściwości w ES5. Jednak dla kompatybilności wstecznej z ES3, i tak sugeruję ich cytowanie.

Stworzyłem również narzędzie, które powie ci, czy dana nazwa właściwości może być używana bez cudzysłowów i / lub z notacją kropkową. Wypróbuj na mothereff.in/js-properties .

Zrzut ekranu

Mathias Bynens
źródło
To narzędzie uratowało życie. Dzięki za opublikowanie tego.
Chris Christensen,
Zszedłem z urwiska, miałem spaść z bardzo stromego zbocza i ruszyłem w kierunku pewnej, całkowitej, krwawej śmierci; ale niestety kliknąłem link w twojej odpowiedzi, który zawierał bardzo proste narzędzie JS, które nie pozwoliło mi spaść z tego urwiska. To narzędzie uratowało życie.
Andrew
8

Tutaj nie ma różnicy. Tylko kwestia stylu. Jednym z powodów tego jest możliwość użycia „super” lub „class” jako klucza, ponieważ są to zastrzeżone słowa kluczowe.

Niektórzy ludzie mogą mieć pokusę, aby podać ciąg znaków z białymi spacjami, a następnie wywołać o [„Mogę mieć białe spacje”].

Raynos
źródło
3

Nie, nie javascript. Jednak niektóre parsery JSON zakończą się niepowodzeniem, gdy nie będzie cytatów wokół kluczy.

01001111
źródło
35
Klucze bez cudzysłowów są niepoprawne w JSON.
Ned Batchelder,
1

Są sytuacje, w których są różne. Na przykład, jeśli używasz jQuery i tworzysz listę parametrów do przekazania podczas wywoływania komendy jQuery $ () w celu utworzenia elementu, słowa cytowane zamieniane są w parametry, a słowa niecytowane zamieniane w funkcje. Na przykład „size” ustawi atrybut size obiektu, a size (bez cudzysłowów) wywoła funkcję size () na obiekcie. Zobacz jQuery () , u dołu:

Chociaż drugi argument jest wygodny, jego elastyczność może prowadzić do niezamierzonych konsekwencji (np. $ („ <input>”, {Size: „4”}) wywołując metodę .size () zamiast ustawiania atrybutu size). Poprzedni blok kodu można zatem zapisać jako:

spekary
źródło
Nie sądzę, że ten przykład mówi to, co myślisz. Podany przez ciebie problem dotyczy tego, że jQuery ma metodę o nazwie rozmiar, a konflikt między rozmiarem metody a rozmiarem atrybutu zostaje rozwiązany poprzez wybranie metody. W jQuery zdarzają się przypadki, w których przekazanie wartości jako łańcucha lub innego typu powoduje zmianę zachowania, ale nigdy od zdefiniowania właściwości o poprawnej nazwie właściwości w cudzysłowie, a nie w cudzysłowach.
Alex Weitzer