Q:

Defining a JavaScript object in console

When I type simple objects to Chrome JavaScript Console, I get an output like this:
>true
true
>1/3
0.3333333333333333

And so on.
But a syntax error occurs when I type objects:
>{ a: 1, b: 2 }
SyntaxError: Unexpected token :
arguments: Array[1]
0: ":"
length: 1
__proto__: Array[0]
get message: function getter() { [native code] }
get stack: function getter() { [native code] }
set message: function setter() { [native code] }
set stack: function setter() { [native code] }
type: "unexpected_token"
__proto__: Error

While I know for sure that this expression could be correctly used in initializing an object, because:
>obj = { a: 1, b: 2 }
Object
a: 1
b: 2
__proto__: Object

Maybe it's a silly question, but I really want to know the reason why is this happening?

A:

Because your statement is being evaluated as a block, not an object literal declaration.

Note that an ExpressionStatement cannot start with an opening curly brace because that might make it ambiguous with a Block. Also, an ExpressionStatement cannot start with the function keyword because that might make it ambiguous with a FunctionDeclaration.

To make it evaluate as an expression, it needs to be the right-hand side of an assignment, wrapped in parentheses or preceded by an operator. (!{a:1,b:2})

A:

 { a: 1, b: 2 }

is a code block, with two wrongly labelled variables.
To create an object, surround the code block by parentheses, so that the braces are interpreted as object literals:
({ a: 1, b: 2 })

A:

It's because an opening { with no context is interpreted as the beginning of a block. You can use parentheses:
({ a: 1, b: 2 })

As it is though, it's just a block of execution - like one might find after an if or for. So you can type:
{alert("Hello!");}

Here's more about that. Blocks sort of return values too, which is both awesome and disappointing.

