我很遗憾为什么以下代码按照它的方式执行它的工作。
对于下面的表达式,我希望得到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
答案 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
被提取的对象