我很遗憾为什么以下代码按照它的方式执行它的工作.
对于下面的表达式,我希望得到1作为结果,因为在文字的右侧我们实际上有一个obj.
表达:
> { a : 1 }.a
Run Code Online (Sandbox Code Playgroud)
结果Chrome:
Syntax error: Unexpect token .
Run Code Online (Sandbox Code Playgroud)
结果NodeJS
1
Run Code Online (Sandbox Code Playgroud)
(另一个问题:为什么nodejs和chrome在这方面有所不同(以下)
虽然表达式本身有语法错误,但将其分配给变量仍然有效.
> var x = { a : 1 }.a; x;
Run Code Online (Sandbox Code Playgroud)
结果:
1
Run Code Online (Sandbox Code Playgroud)
现在在表达式周围使用eval可以在Chrome和NodeJS中使用
> eval({ a : 1 }.a)
Run Code Online (Sandbox Code Playgroud)
结果Chrome和Node
1
Run Code Online (Sandbox Code Playgroud)
现在使用eval和基于字符串的表达式都不适用于平台
eval("{a:1} .a")
结果Chrome:
SyntaxError: Unexpected token >
Run Code Online (Sandbox Code Playgroud)
结果NodeJS:
... //REPL waits more code
Run Code Online (Sandbox Code Playgroud)
最后括号解决了这一切,但为什么呢?
> eval("({ a : 1 }.a)")
Run Code Online (Sandbox Code Playgroud)
结果:
Works everywhere
Run Code Online (Sandbox Code Playgroud)
eval取一个字符串,所以调用eval({ a : 1 }.a)是一样的eval("1").
在语句上下文中,{}分隔块,而不是对象文字.您可以使用()分组运算符进入表达式上下文.
所以:
{ a : 1 }.a
Run Code Online (Sandbox Code Playgroud)
实际上是一个块,标签,数字文字和点访问:
{
a: 1
}
.a
Run Code Online (Sandbox Code Playgroud)
节点REPL实际上在表达式上下文中运行,但这是不寻常的.他们运行你的代码eval("(" + replInput + ")")
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |