JavaScript语法疯狂 - 任何人都知道发生这种情况的背景

Pet*_*tai 3 javascript syntax

我很遗憾为什么以下代码按照它的方式执行它的工作.

对于下面的表达式,我希望得到1作为结果,因为在文字的右侧我们实际上有一个obj.

表达:

> { a : 1 }.a 
Run Code Online (Sandbox Code Playgroud)

结果Chrome:

Syntax error: Unexpect token .
Run Code Online (Sandbox Code Playgroud)

结果NodeJS

1
Run Code Online (Sandbox Code Playgroud)

(另一个问题:为什么nodejs和chrome在这方面有所不同(以下)

虽然表达式本身有语法错误,但将其分配给变量仍然有效.

> var x = { a : 1 }.a; x;
Run Code Online (Sandbox Code Playgroud)

结果:

1
Run Code Online (Sandbox Code Playgroud)

现在在表达式周围使用eval可以在Chrome和NodeJS中使用

> eval({ a : 1 }.a)
Run Code Online (Sandbox Code Playgroud)

结果Chrome和Node

1
Run Code Online (Sandbox Code Playgroud)

现在使用eval和基于字符串的表达式都不适用于平台

eval("{a:1} .a")

结果Chrome:

SyntaxError: Unexpected token >
Run Code Online (Sandbox Code Playgroud)

结果NodeJS:

... //REPL waits more code
Run Code Online (Sandbox Code Playgroud)

最后括号解决了这一切,但为什么呢?

> eval("({ a : 1 }.a)")
Run Code Online (Sandbox Code Playgroud)

结果:

Works everywhere
Run Code Online (Sandbox Code Playgroud)

Esa*_*ija 8

eval取一个字符串,所以调用eval({ a : 1 }.a)是一样的eval("1").

在语句上下文中,{}分隔块,而不是对象文字.您可以使用()分组运算符进入表达式上下文.

所以:

{ a : 1 }.a
Run Code Online (Sandbox Code Playgroud)

实际上是一个块,标签,数字文字和点访问:

{
   a:  1
}

.a
Run Code Online (Sandbox Code Playgroud)

节点REPL实际上在表达式上下文中运行,但这是不寻常的.他们运行你的代码eval("(" + replInput + ")")