2010-05-20 8 views
10

Si prega di fare riferimento al codice qui sotto, quando I "commento in" una delle righe commentate, provoca l'errore (in IE) di "':' previsto". Quindi la mia conclusione è corretta, cioè questa incapacità di fornire un riferimento a un valore dell'oggetto, come una chiave oggetto in una stringa letterale; questo è strettamente un problema di interpretazione/parsing? È un candidato per una "parte" terribile (o almeno "cattiva") di Javascript, al contrario delle "buone parti" di Crockford?Questa restrizione letterale dell'oggetto JavaScript è strettamente dovuta all'analisi?

<script> 
var keys = {'ONE': 'one'}; 

//causes error: 
//var obj1 = {keys.ONE: 'value1'}; 
//var obj1 = {keys['ONE']: 'value1'}; 

//works 
var obj1 = {}; 
obj1[keys.ONE] = 'value1'; 

//also works 
var key_one = keys.ONE; 
var obj2 = {key_one: 'value1'}; 
</script> 
+1

BTW 'var = key_one keys.ONE; var obj2 = {key_one: 'value1'}; 'non funziona come previsto. La proprietà di 'obj2' sarà' key_one' e non il valore di 'key.ONE' quindi non' one'. – RoToRa

+1

Si noti che sebbene l'ultimo esempio funzioni, crea un oggetto con la proprietà 'key_one', non la proprietà' keys.One'. La variabile 'key_one' è irrilevante per l'oggetto letterale nella riga successiva. – Guffa

+0

capito .... che potrebbe essere fonte di confusione .... dovrebbe o non consentire tutte le stringhe "non quotate", o de-referenziare i riferimenti, qualunque essi siano –

risposta

15

La limitazione della sintassi dell'oggetto letterale è che i nomi devono essere letterali. Poiché i nomi possono essere specificati sia come identificatore che come stringa, non è invece possibile utilizzare una variabile.

questo creerà un oggetto con una proprietà n, non una proprietà answer:

var n = 'answer'; 
var o = { n: 42 }; 
+0

I valori letterali numerici sono anche nomi di proprietà validi. Inoltre, in ES5, i nomi possono essere specificati come un nome identificatore (vale a dire, non solo identificatori, ma anche parole riservate). Vedi http://stackoverflow.com/a/9568622/96656. –

6

Non è possibile utilizzare variabili come tasti quando si definisce oggetto con {}

Pertanto essi vengono interpretati come nomi di stringa e possono consistere solo di caratteri avaliable nomi di variabili

il

objectname[anythingThatReturnsValue]='value1'; è la strada da percorrere.

ANCHE

È possibile generare una stringa e analizzarlo

var s='{"'+keys.ONE+'": "value1"}'; 
var obj=JSON.parse(s); 
//or 
s='var obj2='+s; 
eval(s); 

Entrambi i metodi di cui sopra sono cattive pratiche per la creazione di oggetti in JavaScript e io non li consigliano.

+0

È possibile utilizzare le variabili come chiavi durante la definizione degli oggetti con {}, vedi il secondo blocco "funziona anche". –

+1

@George: No, non puoi. Il codice viene eseguito, ma non utilizza la variabile nell'oggetto letterale. – Guffa

+0

@George: Significa che è un 'errore di sintassi' e non c'è nulla che tu possa fare al riguardo :) –

2

Pensateci: se dovesse lavorare nel modo desiderato sarebbe totalmente introdurre un'ambiguità lingua.

var obj = {something:"red"} 
var obj = {"something":"red"} 

Le due dichiarazioni sono equivalenti in JavaScript, perché le chiavi bareword sono "autoquoted." Quindi se something significa la stringa letterale "qualcosa", come potrebbe anche riferirsi alla variabile "qualcosa". Non può Pertanto, se si desidera utilizzare le variabili, è necessario utilizzare la notazione a parentesi quadre anziché la notazione key : value.

1

Si può provare:

var obj = {}; 
var val = 'foo'; 

obj[val] = 'bar'; 

obj.foo >>> 'bar'; 
Problemi correlati