Risposte:
No, le virgolette non fanno differenza (a meno che, come hai notato, non desideri utilizzare una chiave che non sia un identificatore JavaScript valido).
Come nota a margine, il formato di scambio dei dati JSON non richiede doppie virgolette intorno identificatori (e non senza permettere virgolette singole).
Dai nomi di proprietà / chiavi oggetto non quotati in JavaScript , il mio articolo sull'argomento:
Le virgolette possono essere omesse solo se il nome della proprietà è un valore letterale numerico o un nome identificativo valido .
[...]
La notazione parentesi può essere tranquillamente utilizzata per tutti i nomi di proprietà.
[...]
La notazione a punti può essere utilizzata solo quando il nome della proprietà è un nome identificativo valido.
Si noti che le parole riservate possono essere utilizzate come nomi di proprietà non quotati in ES5. Tuttavia, per la retrocompatibilità con ES3, suggerirei comunque di citarli.
Ho anche creato uno strumento che ti dirà se un dato nome di proprietà può essere usato senza virgolette e / o con notazione punto. Provalo su mothereff.in/js-properties .
Non c'è differenza qui. Solo una questione di stile. Uno dei motivi per farlo è la possibilità di utilizzare "super" o "classe" come chiave poiché si tratta di parole chiave riservate.
Alcune persone potrebbero essere tentate di passare una stringa con spazi bianchi, quindi chiamare o ['I have have whitespace'] Ma definirei questa cattiva pratica.
No, non per JavaScript. Tuttavia, alcuni parser JSON falliranno quando le virgolette intorno alle chiavi non sono presenti.
Ci sono alcune situazioni in cui sono diverse. Ad esempio, se si utilizza jQuery e si crea un elenco di parametri da passare quando si chiama il comando jQuery $ () per creare un elemento, le parole tra virgolette vengono trasformate in parametri e le parole senza virgolette vengono trasformate in funzioni. Ad esempio, "size" imposterà l'attributo size dell'oggetto e size (senza virgolette) chiamerà la funzione size () sull'oggetto. Vedi jQuery () , nella parte inferiore:
Mentre il secondo argomento è conveniente, la sua flessibilità può portare a conseguenze non intenzionali (ad esempio $ ("
<input>", {size: "4"}) chiamando il metodo .size () invece di impostare l'attributo size). Il blocco di codice precedente potrebbe quindi essere scritto come:
obj = { 12e34: true };non è lo stesso diobj = { '12e34': true };. Il primo richiederebbe di accedere alla proprietà tramiteobj['1.2e+35'], mentre per il secondo che userestiobj['12e34']. Vedi la mia risposta per maggiori dettagli.