admin管理员组

文章数量:1202392

The following code produces a syntax error in Chrome and Firefox, but not Node.js:

{"hello": 1}

However, the following code works everywhere:

var x = {"hello": 1}

Also, the following works everywhere:

{hello: 1}

What is the explanation for this strange behavior?

The following code produces a syntax error in Chrome and Firefox, but not Node.js:

{"hello": 1}

However, the following code works everywhere:

var x = {"hello": 1}

Also, the following works everywhere:

{hello: 1}

What is the explanation for this strange behavior?

Share Improve this question edited Dec 31, 2024 at 9:44 dumbass 27.2k4 gold badges36 silver badges73 bronze badges asked Jun 25, 2013 at 13:39 ipartolaipartola 1,6463 gold badges15 silver badges25 bronze badges 0
Add a comment  | 

2 Answers 2

Reset to default 17

The NodeJS REPL evaluates code as an expression, by wrapping the code in parentheses, causing {"hello":1} to be ({"hello":1}) which is parsed successfully as an object literal.

Usually and elsewhere (in Chrome/Firefox's console), the curly braces are parsed as the delimiters of a block, like:

/*imagine if (true) */ {
    "hello": 1 // <-- What's this syntax? It's meaningless.
}

{hello:1} parses successfully, because hello in this context has the meaning of a label:

/*imagine if (true) */ {
    hello: 1;
} //        ^-- Automatic Semicolon Insertion

The first example is not an object literal, it is a block. Blocks contain statements. The squence String literal, colon, Number literal is not a valid statement.

The second example is an object literal.

The third example is also a block, but you have replaced the string literal and colon with a label (which is allowed, but is pointless as there is no loop).

Context is important in JavaScript.

本文标签: