2009-04-07 8 views
6

Nella maggior parte dei serializzatori/deserializzatori JSON, la parte "chiave" in un dizionario javascript/array hash viene scritta come una stringa.Perché la parte "chiave" in un hash/dict JS deve essere una stringa?

Qual è il vantaggio di utilizzare una stringa come chiave invece di digitare semplicemente il nome previsto?

Ad esempio, dire io definisco due oggetti k1 e k2 in questo modo:

var k1 = { a: 1, b: 2, c: 3 };   // define name normally 
var k2 = { "a": 1, "b": 2, "c": 3 }; // define name with a string 

E poi corse le seguenti prove:

alert(k1 == k2);     // false (of course) 

alert(k1.a == k2.a);    // true 
alert(k1["b"] == k2["b"]);   // true 

alert(uneval(k1));     // returns the k1 object literal notation. 
alert(uneval(k2));     // returns the same string as above line. 

alert(uneval(k1) == uneval(k2)); // true 

Allora, qual è il punto di avere le chiavi siano in sono state definite doppie virgolette (una stringa) come nel modo k2 invece di digitare semplicemente i nomi dei tasti come nel modo in cui è stato definito k1?


Ho appena visto questo oltre a Ajaxian indicando Aaron Boodman's blog entry:

chromium.tabs.createTab({ 
"url": "http://www.google.com/", 
"selected": true, 
"tabIndex": 3 
}); 

Dal momento che usa anche per caso cammello tabIndex, non vedo alcun punto nel usando una stringa a tutti.

Perché non:

chromium.tabs.createTab({ 
url: "http://www.google.com/", 
selected: true, 
tabIndex: 3 
}); 

Perché un ninja JS segue la convenzione di trasformare url, selected e tabIndex in una stringa?

risposta

6

Perché JSON è un sottoinsieme della sintassi letterale JavaScript effettiva. Per semplicità nell'implementazione dei parser JSON, le doppie virgolette sono sempre richieste attorno alle stringhe, e poiché le chiavi in ​​JSON sono stringhe, sono richieste lì.

Non tutti i JavaScript legali sono legali JSON. Mentre è possibile definire i letterali degli oggetti in JavaScript senza virgolette, se si desidera un JSON interoperabile, sarà necessario inserirli.

+0

Suppongo che la convenzione in javascript sia stata trapelata dall'aver lavorato con un sacco di JSON quindi ... – chakrit

+0

Credo che la compatibilità con Python sia stata citata come motivo per le citazioni – cobbal

+0

@chakrit Sì. Inoltre, come sottolineato da gizmo, è generalmente più sicuro usare le virgolette in JavaScript poiché non devi preoccuparti delle parole riservate.Ad esempio {do: "something"} non è un JavaScript legale. –

1

Perché così facendo, si evita di utilizzare, per errore, una parola chiave riservata javascript, come "fare" per esempio. L'uso della notazione stringa ti ha tenuto al sicuro.

0

Se si deve credere al diagramma di sintassi di json.org, i nomi delle proprietà bareword non sono standard. Quanti browser hai eseguito i tuoi test?

+0

Non molto ... ma io * faccio * mantenere un'enorme applicazione javascript al lavoro. E io uso sempre i nomi bareword (ad es. Creare classi e simili) e funziona in tutti i principali browser ... IE FF Opera Safari. – chakrit

+0

JSON è un sottoinsieme di JavaScript. Richiede preventivi, ma JavaScript no. –

0

Oltre a ottenere lontano da parole chiave riservate in realtà si può usare qualsiasi caratteri nei nomi di proprietà - inclusi gli spazi, i due punti ...

Non realmente sicuro perché l'hai fatto. Preferisco usare la normale notazione "oggetto".