以下代码在Chrome和Firefox中产生语法错误,但不会产生Node.js:
{"hello": 1}
但是,以下代码无处不在:
var x = {"hello": 1}
此外,以下工作无处不在:
{hello: 1}
这种奇怪行为有什么解释?
答案 0 :(得分:13)
第一个例子不是对象文字,而是block。块包含语句。序列字符串文字,冒号,数字文字不是有效的语句。
第二个例子是一个对象文字。
第三个例子也是一个块,但是你已经用label取代了字符串文字和冒号(这是允许的,但是因为没有循环而没有意义)。
上下文在JavaScript中很重要。
答案 1 :(得分:11)
NodeJS REPL evaluates code as an expression,将代码包装在括号中,使{"hello":1}
成为({"hello":1})
,并将其成功解析为对象文字。
通常和其他地方(在Chrome / Firefox的控制台中),花括号被解析为块的分隔符,如:
/*imagine if (true) */ {
"hello": 1 // <-- What's this syntax? It's meaningless.
}
{hello:1}
成功解析,因为此上下文中的hello
具有label的含义:
/*imagine if (true) */ {
hello: 1;
} // ^-- Automatic Semicolon Insertion