我有点迷惑为什么下面的代码会按照它的方式做事。
对于以下表达式,我希望结果为 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 和 Node
1
现在使用 eval 和基于字符串的表达式两个平台都不起作用
eval("{ a : 1 }.a")
Chrome 结果:
SyntaxError: Unexpected token >
结果 NodeJS:
... //REPL waits more code
最后括号解决了所有问题,但为什么呢?
> eval("({ a : 1 }.a)")
结果:
Works everywhere
最佳答案
eval
接受一个字符串,所以调用 eval({ a : 1 }.a)
与 eval("1")
.
在语句上下文中,{}
分隔 block ,而不是对象文字。您可以使用 ()
作为分组运算符进入表达式上下文。
所以:
{ a : 1 }.a
实际上是 block 、标签、数字文字和点访问什么都没有:
{
a: 1
}
.a
Node REPL 实际上一开始就在表达式上下文中运行,但这并不常见。他们像 eval("("+ replInput + ")")
关于JavaScript 语法疯狂 - 任何人都知道为什么会发生这种情况的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15809711/