3

为什么 Node REPL 和在脚本上运行的 Node 引擎解释以下表达式的方式存在差异:{...a}

我正在运行节点v8.3.0(通过运行发现node -v),并发现传播运算符的命令行解释和脚本解释之间存在奇怪的差异。

考虑以下:

$ node -v
v8.3.0
$ node

(获取节点的版本,然后运行节点解释器)

> const a = {foo: 'bar'};
undefined
> {...a};
{ foo: 'bar' }

(创建一个对象文字并将其存储在. 然后,创建另一个对象文字并用onconst a填充。spread operatora

到目前为止,一切都很好。但是如果你创建一个file.js

const a = { foo: 'bar' };
{...a};

并运行> node file.js,结果是一个SyntaxError: Unexpected token ...

我可能会回答我自己的问题,但我目前的操作理论是 Node 通常将{}作为可执行代码块进行解释,而 Node 实时解释器主要寻找独立的表达式。(这个答案意味着一切都被包裹在括号中,我怀疑这是因为多行代码块是可能的,但他可能在正确的轨道上)。

但如果是这种情况,为什么{ foo: 'bar' }(独立)在 REPL 和 Node 脚本中都没有错误地进行评估?

以下内容在 REPL 和 Node 脚本中均无错误地执行:

[1, 2, 3]
[...a]
{foo: 'bar'}

但这在 Node 中失败了:

{...b}

点差算子有什么区别?


编辑: Per Pointy{foo: 'bar'} 确实评估独立,但不 { foo: 'bar', sna: 'fu' } 评估。Node 将大括号之间的代码解释为代码块,并且foo: 'bar'是有效的 Javascript 表达式,while...afoo: 'bar', sna: 'fu'are 不是。

4

1 回答 1

2

这一切都与如何解析语句有关。以 a 开头的语句(不是表达式{)是语句块。当{出现在表达式中时,它引入了一个对象字面量。

该声明:

{ foo: 'bar' }

当解释为语句和解释为表达式时,语法正确但语义不同。在前一种情况下,它是块语句:

{
   foo: 'bar'
}

这是一个包含一个语句的块,标记为表达式'bar'。它不是对象文字。

表达式在引入语句块{...a}时失败,因为它本身不能被解析为语句。{...a

于 2018-01-04T15:31:15.997 回答