views:

110

answers:

3

The following will show in Firebug or in jsconsole.com or in other Javascript interactive console:

>>> 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

why is the 1 returning for {a : 1} and why is {a : 1, b : 2.2} giving an error? In Ruby, they would come back the same way you defined it.

+18  A: 

The second line is giving you a SyntaxError because the { token at the beginning of it causes an ambiguity, the parser treats it as if it were a Block statement, not the start of an object literal.

For example, a valid Block statement:

{ foo: 'bar' }

The above looks like an object literal, but it isn't, because the code is evaluated in statement context.

It will be parsed as a Block, that contains a labelled statement (foo), followed by an expression statement ('bar').

To ensure that you are using the grammar of an object literal, you can wrap it with parentheses (also known as the grouping operator):

({ foo: 'bar' })

The grouping operator can only take Expressions, therefore there is no ambiguity.

See also:

CMS
+1 I learned something new today. I've never put just object-literal syntax into a REPL without assigning it to a var, but this is interesting to know ..
Matt
(a ‘labelled statement’ is something JavaScript inherited from C, where it can be used for `goto`​s. Labelled statements are almost never used in JavaScript, which is why it comes as a surprise that `{foo: 'bar'}` can be taken as a valid statement.)
bobince
Totally awesome answer, would upvote twice if possible!
macke
A: 

I'm not 100% positive, but what I think is happening is that in the second line you're defining a block, not an object. Thus the parse error comes when the parser reaches the comma, since it expects a semi color. The labels defned are labels, like in a goto or switch statement. I hope this explanation makes any sense.

macke
A: 

console do as eval('you input')

eval({....}) --- this will get an error eval('({....})')---eval string as a function

wanin.lezu