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

时间:2013-04-04 11:20:44

标签: javascript syntax

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

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

表达式:

> { a : 1 }.a 

结果Chrome:

Syntax error: Unexpect token .

结果NodeJS

1

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

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

> var x = { a : 1 }.a; x;

结果:

1

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

> eval({ a : 1 }.a)

结果Chrome和节点

1

现在使用eval和基于字符串的表达式 平台无法正常工作

  

eval(“{a:1} .a”)

结果Chrome:

SyntaxError: Unexpected token >

结果NodeJS:

... //REPL waits more code

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

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

结果:

Works everywhere

2 个答案:

答案 0 :(得分:8)

eval需要一个字符串,因此调用eval({ a : 1 }.a)eval("1")相同。

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

所以:

{ a : 1 }.a

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

{
   a:  1
}

.a

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

答案 1 :(得分:1)

试试({ a : 1 }).a 这也可以在任何地方使用,因为首先执行圆括号中的代码,然后提取该对象的.a

`{ a:  1 }`

只是一个块,不会为.运算符返回任何内容,但将其括在()中会返回一个.a被提取的对象