Qual è il comportamento di battitura a macchina {un: 1} dando 1, e {a: 1, b: 2} dando un errore in una console Javascript?

StackOverflow https://stackoverflow.com/questions/3731802

Domanda

Di seguito vi mostrerà in Firebug o in jsconsole.com o in altre console interattiva Javascript:

>>> foo = { a : 1, b : 2.2 }
Object { a=1, more...}

>>> foo.a
1

>>> foo.b
2.2

>>> { a : 1, b : 2.2 }
SyntaxError: invalid label { message="invalid label", more...}

>>> { a : 1 }
1

Perché è la 1 tornando per {a : 1} e perché è {a : 1, b : 2.2} dando un errore? In Ruby, sarebbero tornati allo stesso modo in cui è stato definito esso.

È stato utile?

Soluzione

La seconda linea è dando un SyntaxError perché il { gettone all'inizio di esso provoca un equivoco, il parser lo tratta come se fosse una blocco di istruzioni , non l'inizio di un letterale oggetto.

Per esempio, una dichiarazione di blocco valida:

{ foo: 'bar' }

È possibile che questo aspetto come un letterale oggetto, ma non è, perché il codice viene valutata in contesto istruzione .

Sarà analizzato come un blocco, che contiene un istruzione etichettata (foo), seguita da un'istruzione di espressione ('bar').

Per garantire che si sta utilizzando la grammatica di un letterale oggetto, si può avvolgere con parentesi (noto anche come l'operatore di raggruppamento ):

({ foo: 'bar' })

L'operatore raggruppamento può solo prendere Espressioni, quindi non c'è ambiguità.

Vedi anche:

Altri suggerimenti

Io non sono al 100% positivo, ma quello che penso sta accadendo è che nella seconda linea che si sta definendo un blocco, non un oggetto. Così l'errore di analisi viene quando il parser raggiunge la virgola, in quanto prevede un colore semi. Le etichette defnite sono le etichette, come in un goto o switch. Spero che questa spiegazione ha senso.

console fare come eval ( 'si immette')

eval({....}) --- this will get an error
eval('({....})')---eval string as a function
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top