Was ist der Unterschied zwischen Objektschlüsseln mit und ohne Anführungszeichen?

209

Gibt es einen Unterschied zwischen

obj = {'foo': 'bar'} 

und

obj = {foo: 'bar'}

Ich habe festgestellt, dass Sie -den Schlüssel nicht verwenden können, wenn ich die Anführungszeichen nicht verwende. Aber macht es tatsächlich einen Unterschied? Wenn ja, welche?

meo
quelle

Antworten:

136

Nein, die Anführungszeichen machen keinen Unterschied (es sei denn, Sie haben, wie Sie bemerkt haben, einen Schlüssel verwenden wollen, der keine gültige JavaScript-Kennung ist).

Nebenbei bemerkt erfordert das JSON-Datenaustauschformat doppelte Anführungszeichen um Bezeichner (und erlaubt keine einfachen Anführungszeichen).

bdukes
quelle
88
Eigentlich sind die Anführungszeichen kann einen Unterschied machen , wenn Sie ein numerisches Literal als Eigenschaftsnamen verwenden. Zum Beispiel obj = { 12e34: true };ist nicht dasselbe wie obj = { '12e34': true };. Ersteres würde erfordern, dass Sie über die Eigenschaft zugreifen obj['1.2e+35'], während Sie für letzteres verwenden würden obj['12e34']. Siehe meine Antwort für weitere Details.
Mathias Bynens
1
Stimmt, aber es wäre brillant, wenn doppelte Anführungszeichen optional wären, wenn ein erstes Zeichen + eine alphanumerische Zahl angegeben würde, und könnten einige Whitespace-Fans auch unsichtbare Leerzeichen oder Tabulatoren nennen? ideal für Daten, die nicht tief verschachtelt sind.
Jason Sebring
124

Aus nicht zitierten Eigenschaftsnamen / Objektschlüsseln in JavaScript , meine Beschreibung zum Thema:

Anführungszeichen können nur weggelassen werden, wenn der Eigenschaftsname ein numerisches Literal oder ein gültiger Bezeichnername ist .

[…]

Die Klammernotation kann sicher für alle Eigenschaftsnamen verwendet werden.

[…]

Die Punktnotation kann nur verwendet werden, wenn der Eigenschaftsname ein gültiger Bezeichnername ist.

Beachten Sie, dass reservierte Wörter in ES5 als nicht zitierte Eigenschaftsnamen verwendet werden dürfen. Aus Gründen der Abwärtskompatibilität mit ES3 würde ich jedoch empfehlen, sie trotzdem zu zitieren.

Ich habe auch ein Tool erstellt, das Ihnen sagt, ob ein bestimmter Eigenschaftsname ohne Anführungszeichen und / oder mit Punktnotation verwendet werden kann. Probieren Sie es unter Mothereff.in/js-properties aus .

Bildschirmfoto

Mathias Bynens
quelle
Dieses Tool war ein Lebensretter. Vielen Dank für die Veröffentlichung.
Chris Christensen
Ich war auf dem Weg von einer Klippe, wollte gerade eine sehr steile Steigung hinunterfallen und stürzte auf einen bestimmten, völligen, blutigen Tod zu; Aber leider habe ich in Ihrer Antwort auf einen Link geklickt, der ein sehr einfaches JS-Tool enthielt, das mich daran hinderte, von dieser Klippe zu fallen. Dieses Tool war ein Lebensretter.
Andrew
8

Hier gibt es keinen Unterschied. Nur eine Frage des Stils. Einer der Gründe dafür ist die Möglichkeit, "Super" oder "Klasse" als Schlüssel zu verwenden, da dies reservierte Schlüsselwörter sind.

Einige Leute könnten versucht sein, eine Zeichenfolge mit Leerzeichen zu übergeben und dann o ['Ich kann Leerzeichen haben'] aufzurufen. Aber ich würde diese schlechte Praxis nennen.

Raynos
quelle
3

Nein, nicht zu Javascript. Einige JSON-Parser schlagen jedoch fehl, wenn die Anführungszeichen um die Schlüssel nicht vorhanden sind.

01001111
quelle
35
Schlüssel ohne Anführungszeichen sind in JSON ungültig.
Ned Batchelder
1

Es gibt Situationen, in denen sie unterschiedlich sind. Wenn Sie beispielsweise jQuery verwenden und beim Aufrufen des Befehls jQuery $ () zum Erstellen eines Elements eine Liste der zu übergebenden Parameter erstellen, werden in Anführungszeichen gesetzte Wörter in Parameter und nicht in Anführungszeichen gesetzte Wörter in Funktionen umgewandelt. Beispielsweise legt "size" das Größenattribut des Objekts fest, und size (keine Anführungszeichen) ruft die size () -Funktion für das Objekt auf. Siehe jQuery () unten:

Obwohl das zweite Argument praktisch ist, kann seine Flexibilität zu unbeabsichtigten Konsequenzen führen (z. B. $ (" <input>", {size: "4"}), wenn die Methode .size () aufgerufen wird, anstatt das Größenattribut festzulegen). Der vorherige Codeblock könnte also stattdessen geschrieben werden als:

spekary
quelle
Ich glaube nicht, dass dieses Beispiel sagt, was Sie denken, dass es sagt. Das von Ihnen angegebene Problem ist, dass jQuery über eine Methode namens size verfügt und der Konflikt zwischen der Methodengröße und der Attributgröße durch Auswahl der Methode behoben wird. Es gibt Fälle in jQuery, in denen das Übergeben eines Werts als Zeichenfolge oder eines anderen Typs zu einer Verhaltensänderung führt, jedoch niemals durch das Definieren einer Eigenschaft mit einem gültigen Eigenschaftsnamen in Anführungszeichen oder nicht in Anführungszeichen.
Alex Weitzer