为什么在交互式控制台中计算时对象文字有时需要用括号括起来?

问题描述 投票:0回答:2

我有点不明白为什么下面的代码会这样做。

对于以下表达式,我期望结果为 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)")
    
javascript syntax object-literal
2个回答
8
投票

eval

 接受一个字符串,因此调用 
eval({ a : 1 }.a)
eval("1")
 相同。

在语句上下文中,

{}

 分隔块,而不是对象文字。您可以使用 
()
 作为分组运算符进入表达式上下文。

所以:

{ a : 1 }.a

实际上是一个块、标签、数字文字和点访问:

{ a: 1 } .a

Node REPL 实际上一开始就在表达式上下文中运行,但这很不寻常。他们运行你的代码就像

eval("(" + replInput + ")")


    


1
投票
尝试

({ a : 1 }).a

这也适用于任何地方,因为首先执行圆括号中的代码,然后提取该对象的 
.a

`{ a: 1 }`

只是一个块,不会返回任何内容供

.

 运算符处理,但将其包含在 
()
 中确实会返回一个从中提取 
.a
 的对象

© www.soinside.com 2019 - 2024. All rights reserved.