我很困惑以下代码为什么会以这种方式执行。
对于下面的表达式,我期望结果为1,因为在字面量的右侧我们实际上有一个对象。
表达式:
> { a : 1 }.a
谷歌浏览器的结果:
Syntax error: Unexpect token .
NodeJS 结果
1
(另一个问题是:为什么nodejs和chrome在这个问题(以及接下来的问题)上有所不同)
虽然表达式本身存在语法错误,但将其赋值给变量仍然有效。
> var x = { a : 1 }.a; x;
结果:
1
现在在Chrome和NodeJS中,使用eval来处理表达式确实可以工作。
> 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
({ a : 2 }.a)
// 2 - karim79eval
代码总是在语句上下文中运行,这就是为什么你需要eval("(" + code + ")" )
在表达式上下文中运行代码的原因。例如,如果code
是"{a:1}"
,那么将被评估的是"({a:1})"
,因为括号是连接在一起的。 - Esailijaeval
只接受一个字符串。如果你传递一个非字符串,它将在执行之前被转换为字符串。所以String({ a : 1 }.a)
是"1"
,而"1"
将作为代码被执行。 - Esailija"1"
,所以代码实际上就是1
。将1
作为 JavaScript 代码进行评估的结果是1
。 :P - Esailija