2010-02-27 13 views
27

Widzę to cały czas: literały obiektów są zadeklarowane tak, że niektóre klawisze są otoczone cudzysłowami, a inne nie. Przykład z jQuery 1.4.2:Dlaczego cytowane są niektóre własności obiektowo-dosłowne, a inne nie?

jQuery.props = { 
    "for": "htmlFor", 
    "class": "className", 
    readonly: "readOnly", 
    maxlength: "maxLength", 
    cellspacing: "cellSpacing", 
    rowspan: "rowSpan", 
    colspan: "colSpan", 
    tabindex: "tabIndex", 
    usemap: "useMap", 
    frameborder: "frameBorder" 
}; 

Jakie jest znaczenie owijania pierwsze dwa klucze posesji (for i class) z cytatami, pozostawiając cytat mniej innych? Czy są jakieś różnice?

Dotykałem ECMAScript 5 specification; wszystko udało mi się znaleźć to [Uwaga 6 pkt 15.12.3, podkr]:

UWAGA 6 Obiekt jest renderowany jako lewy nawias otwarcia następuje zero lub więcej właściwości, oddzielone przecinkami , zamykane prawym nawiasem. Właściwość A to cytowany ciąg reprezentujący klucz lub nazwę właściwości, dwukropek, a następnie usztywniona wartość właściwości . Tablica jest renderowana jako jako lewy nawias otwierający, a następnie zero lub więcej wartości, oddzielonych przecinkami , zamykanych za pomocą prawego wspornika.

Jednak odnosi się to wyłącznie do stringification z JSON.

+0

Zobacz również [? Jaka jest różnica między klawiszami obiektu z cytatami i bez cytatów] (http://stackoverflow.com/questions/4348478/what-is-the-the-difference-between-object-keys-with-quotes-and-without-quotes) – Bergi

+1

Jak to może być duplikat pytania zadawanego dziesięć miesięcy później? Odwróciliście to. – raven

+1

@raven: Odpowiedź na drugie pytanie jest lepsza i najwyraźniej nie należy ich łączyć. Moja flaga została odrzucona. : P – Ryan

Odpowiedz

37

Są to słowa zarezerwowane w JavaScript i (choć niekoniecznie konieczne), składnia języka wymaga, aby były cytowane.

Ściśle mówiąc, czysty zapis "JSON" wymaga przytoczenia wszystkich ciągów "kluczy". Jednak sama JavaScript jest w porządku, ponieważ klucze, które są poprawnymi identyfikatorami (ale nie słowami zastrzeżonymi) są niecałkowite.

2

Słowa kluczowe w języku JavaScript lub słowa kluczowe zastrzeżone są zawsze otoczone cytatami.

1

for i class są słowami kluczowymi w języku. Twój tłumacz wysłałby błąd składni, gdy nie są one cytowane.

Zobacz rozdział 7.6.1.1 w specyfikacji, do której został podłączony.

+0

Mój interpreter (FF10) nie rzuca niczego na '{dla: 1, klasa: 1, null: 1}' i traktuje je jak zwykłe klawisze. –

+0

Aby uzyskać więcej informacji, zobacz http://mathiasbynens.be/notes/javascript-properties. –

1

Javascript ma wiele zarezerwowanych słów, które nie są używane przez język, który moim zdaniem był zarezerwowany dla ewentualnego przyszłego wykorzystania. class jest jednym z nich, mimo że JavaScript nie używa klas. Innym jest goto i nie ma absolutnie żadnej szansy na to, że kiedykolwiek zostanie użyta. Rezultatem jest jednak to, że jeśli chcesz użyć ich jako klucza json, musisz go zacytować. Ściśle mówiąc prawdopodobnie powinieneś zawsze zacytować swoje klucze, aby uniknąć możliwości obrażenia się z niewykorzystanej javascript zarezerwowanej pułapki słów (pamiętaj - nigdy tego nie robię).

5

Jest powód w tym miejscu (dwa plus lata później) do cytowania właściwości literalnych obiektu. Jeśli ktoś chce zminimalizować kod za pomocą Kompilatora zamknięcia, może potrzebować udostępnić właściwości innym plikom źródłowym. W takim przypadku będą unikać zmieniania nazwy przez kompilator. Podając nazwę właściwości, kompilator nie zminimalizuje (zmieni nazwy).

Patrz: Removal of code you want to keep

(. Dotyczy to przynajmniej ustawienia ADVANCED_OPTIMIZATIONS)

Powiązane problemy