2010-05-05 16 views
7

Nella console di Firefox, questo codice genererà errore:JavaScript letterale oggetto notazione confusione

{"d" : ["bankaccountnumber", "$1234.56"] } 
> SyntaxError: invalid label { 
> message="invalid label", more...} 

questo codice funziona bene

{d : ["bankaccountnumber", "$1234.56"] } 
> ["bankaccountnumber", "$1234.56"] 

Questo codice funziona benissimo pure

var a = {'d' : ["bankaccountnumber", "$1234.56"] }; 
a.d 
> ["bankaccountnumber", "$1234.56"] 

Qualcuno può aiutare a spiegare perché è la differenza? Grazie!

+1

http://stackoverflow.com/questions/1509535/javascript-false-and-false/1509664#1509664 è una domanda apparentemente irrilevante, ma con una risposta pertinente a una cosa potresti inciampare su –

risposta

6

Questo a causa della sintassi ambigua. Quando si tenta di fare un oggetto pianura letterale nelle prime due righe, JavaScript è davvero interpretandolo come un insieme di parentesi graffe, poi un'etichetta, poi una dichiarazione:

{ 
    d: ["bankaccountnumber", "$1234.56"] 
} 

Questo codice non restituisce un oggetto , ma solo per l'array. Il primo esempio, hai provato a usare una stringa come etichetta, che è sintassi errata. Il terzo esempio funziona correttamente, creando un oggetto e memorizzandolo in a.

+4

+1 @OP : Affinché sia ​​un'espressione (un oggetto letterale) piuttosto che delle parentesi graffe attorno a un'etichetta seguita da un array letterale, devi utilizzarlo come valore di destra (come nel tuo ultimo esempio). Come valori di mano destra, tutti e tre di questi sarebbero stati validi notazione letterale dell'oggetto (quella che usa 'd:', quella che usa '" d ":', e quella che usa ''d':'). Un po 'OT, ma solo "d": "uno sarebbe valido JSON, se questo è rilevante per quello che stai facendo, perché JSON è un * sottoinsieme * di notazione letterale dell'oggetto. (http://json.org) –

+0

Perché, oh perché, hanno messo GOTO in Javascript ... * sigh * –

+1

@Bears: Non l'hanno fatto, Javascript non ha istruzioni 'goto'. Ha delle etichette, che sono utili per interrompere i loop interni e così via. (Vedi la sezione 12.12 delle specifiche della quinta edizione.Nelle specifiche precedenti, 'goto' era un simbolo riservato ma non c'era alcuna istruzione' goto' - ad esempio, erano di copertura delle loro scommesse.Alla 5a edizione, non più hedging.) –

4

probabilmente sta avendo difficoltà a decidere se si tratta di un'espressione o di un blocco. Se si utilizza la parentesi attorno all'oggetto, funziona come forza un'espressione. L'operatore di raggruppamento, ( e ), forza { e } da analizzare come oggetto letterale.

({"d" : ["bankaccountnumber", "$1234.56"] }) // works 

Leggi Named function expressions demystified. Non è direttamente correlato a questo problema ma lo risolve quando si parla dell'uso di parentesi di gruppo e eval().

Problemi correlati