3

我有点迷失为什么下面的代码会按照它的方式做。

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

表达:

> { a : 1 }.a 

结果铬:

Syntax error: Unexpect token .

结果 NodeJS

1

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

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

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

结果:

1

现在在表达式周围使用 eval 在 Chrome 和 NodeJS 中确实有效

> eval({ a : 1 }.a)

结果 Chrome 和 Node

1

现在使用 eval 和基于字符串的表达式,这两个平台都不起作用

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

结果铬:

SyntaxError: Unexpected token >

结果NodeJS:

... //REPL waits more code

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

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

结果:

Works everywhere
4

2 回答 2

8

eval接受一个字符串,因此调用eval({ a : 1 }.a)eval("1").

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

所以:

{ a : 1 }.a

实际上是块、标签、数字文字和点访问:

{
   a:  1
}

.a

Node REPL 一开始实际上是在表达式上下文中运行的,但这很不寻常。他们像运行您的代码一样eval("(" + replInput + ")")

于 2013-04-04T11:27:58.647 回答
1

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

`{ a:  1 }`

只是一个块,不会返回任何内容供.操作员处理,但将其包含在()其中会返回一个.a已提取的对象

于 2013-04-04T11:31:39.740 回答