我有点不明白为什么下面的代码会这样做。
对于以下表达式,我期望结果为 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)")
eval
接受一个字符串,因此调用
eval({ a : 1 }.a)
与
eval("1")
相同。在语句上下文中,
{}
分隔块,而不是对象文字。您可以使用
()
作为分组运算符进入表达式上下文。所以:
{ a : 1 }.a
实际上是一个块、标签、数字文字和点访问:
{
a: 1
}
.a
Node REPL 实际上一开始就在表达式上下文中运行,但这很不寻常。他们运行你的代码就像
eval("(" + replInput + ")")
({ a : 1 }).a
这也适用于任何地方,因为首先执行圆括号中的代码,然后提取该对象的
.a
。
`{ a: 1 }`
只是一个块,不会返回任何内容供
.
运算符处理,但将其包含在
()
中确实会返回一个从中提取
.a
的对象