2010-02-27 7 views
27

Ich sehe dies die ganze Zeit: Objektliterale so deklariert, dass einige Schlüssel mit Anführungszeichen umgeben sind und andere nicht. Ein Beispiel von jQuery 1.4.2:Warum werden einige Objekt-Literal-Eigenschaften zitiert und andere nicht?

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

Welche Bedeutung hat die ersten beiden Eigenschaftsschlüssel der Verpackung (for und class) mit Zitaten, während die anderen verlassen Zitat weniger? Gibt es irgendwelche Unterschiede?

Ich habe Stochern um die ECMAScript 5 specification; alles, was ich habe in der Lage zu finden ist [Anmerkung 6 von Abschnitt 15.12.3, Hervorhebung von mir]:

HINWEIS 6 Ein Objekt als Öffnung linker geschweifte Klammer, gefolgt von null oder mehr Eigenschaften wiedergegeben wird, getrennt mit Kommas, mit einer rechten Klammer geschlossen. Eine -Eigenschaft ist eine in Anführungszeichen gesetzte Zeichenfolge , die den Schlüssel- oder Eigenschaftsnamen, einen Doppelpunkt und dann den stringifizierten Eigenschaftswert darstellt. Ein Array wird als öffnende linke Klammer gefolgt von null oder mehr Werte, getrennt mit Kommas, mit einer rechten Klammer geschlossen gerendert.

Jedoch bezieht sich dies nur auf die stringification von JSON.

+0

Siehe auch [? Was ist der Unterschied zwischen Objektschlüssel mit Zitaten und ohne Anführungszeichen] (http://stackoverflow.com/questions/4348478/Was ist der Unterschied zwischen Objektschlüsseln mit Anführungszeichen und ohne Anführungszeichen? – Bergi

+1

Wie kann das ein Duplikat einer Frage sein, die zehn Monate später gestellt wurde? Ihr habt es zurückbekommen. – raven

+1

@raven: Die Antwort auf die andere Frage ist besser und anscheinend sollten sie nicht zusammengeführt werden. Meine Flagge wurde abgelehnt. : P – Ryan

Antwort

37

Das sind Javascript reservierte Wörter, und (obwohl nicht wirklich notwendig) die Syntax der Sprache erfordert, dass sie zitiert werden.

Streng genommen erfordert die reine "JSON" -Notation, dass alle der "Schlüssel" -Strings zitiert werden. Javascript selbst ist jedoch in Ordnung mit Schlüsseln, die gültige Bezeichner sind (aber nicht reservierte Wörter), die nicht quoted sind.

2

Javascript-Sprache Schlüsselwörter oder reservierte Schlüsselwörter sind immer von Anführungszeichen darin umgeben.

1

for und class sind Sprachschlüsselwörter. Ihr Interpreter würde einen SyntaxError auslösen, wenn diese nicht aufgelistet sind.

Siehe Abschnitt 7.6.1.1 in der Spezifikation, mit der Sie verbunden sind.

+0

Mein Interpreter (FF10) wirft nichts auf '{for: 1, class: 1, null: 1}' und behandelt sie als normale Schlüssel. –

+0

Weitere Informationen finden Sie unter http://mathiasbynens.be/notes/javascript-properties. –

1

Javascript hat viele reservierte Wörter, die nicht wirklich von der Sprache verwendet werden, die meiner Meinung nach für eine mögliche zukünftige Verwendung reserviert war. class ist einer von diesen, obwohl Javascript keine Klassen verwendet. Ein weiterer ist goto und es gibt absolut keine Chance, dass jemals verwendet wird. Das Ergebnis ist jedoch, dass wenn Sie diese als JSON-Schlüssel verwenden möchten, muss es zitiert werden. Streng genommen sollten Sie Ihre Schlüssel immer nur angeben, um die Möglichkeit zu vermeiden, mit der Javascript ungenutzten reservierten Wortfalle zu verfallen (wohlgemerkt - ich tue es nie).

5

Es gibt einen Grund an dieser Stelle (zwei plus Jahre später), Objektliteraleigenschaften anzugeben. Wenn Sie ihren Code mithilfe des Closure-Compilers minimieren möchten, müssen sie möglicherweise die Eigenschaften für andere Quelldateien zugänglich machen. In diesem Fall wollen sie vermeiden, dass die Symbole vom Compiler umbenannt werden. Wenn Sie den Eigenschaftsnamen angeben, wird der Closure Compiler diese nicht verkleinern (umbenennen).

See: Removal of code you want to keep

(. Dies gilt zumindest die ADVANCED_OPTIMIZATIONS Einstellung)