Javascript 为什么在计算这些表达式时,节点REPL和运行的节点脚本之间存在差异

Javascript 为什么在计算这些表达式时,节点REPL和运行的节点脚本之间存在差异,javascript,node.js,ecmascript-6,read-eval-print-loop,ecma,Javascript,Node.js,Ecmascript 6,Read Eval Print Loop,Ecma,为什么Node REPL和在脚本上运行的节点引擎解释以下表达式的方式不同:{…a} 我正在运行nodev8.3.0(通过运行node-v)并发现排列运算符的命令行解释和脚本解释之间存在奇怪的差异 考虑以下几点: $ node -v v8.3.0 $ node (获取节点的版本,然后运行节点解释器) (创建一个对象文字并将其存储在常量a中。然后,在a上创建另一个对象文字并填充扩展运算符 到目前为止还不错。但是如果您创建一个文件.js: const a = { foo: 'bar' }; {...

为什么Node REPL和在脚本上运行的节点引擎解释以下表达式的方式不同:
{…a}

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

考虑以下几点:

$ node -v
v8.3.0
$ node
(获取节点的版本,然后运行节点解释器)

(创建一个对象文字并将其存储在
常量a
中。然后,在
a
上创建另一个对象文字并填充
扩展运算符

到目前为止还不错。但是如果您创建一个
文件.js

const a = { foo: 'bar' };
{...a};
然后运行
>节点文件.js
,结果是一个
语法错误:意外标记…

我可能在回答我自己的问题,但我目前的操作理论是,Node通常将
{
}
解释为一块可执行代码,而Node live解释器主要寻找独立的表达式。(答案意味着一切都被包装在paren中,我对此表示怀疑,因为多行代码块是可能的,但他可能走对了方向)

但是如果是这种情况,为什么
{foo:'bar'}
(独立)在REPL和节点脚本中计算时都没有错误

在REPL和节点脚本中执行以下操作时不会出错:

[1, 2, 3]
[...a]
{foo: 'bar'}
但这在节点中失败:

{...b}
spread操作符引入了什么区别



编辑:根据,
{foo:'bar'}
进行独立评估,但
{foo:'bar',sna:'fu'}
。Node将大括号之间的代码解释为代码块,
foo:'bar'
是一个有效的Javascript表达式,而
…a
foo:'bar',sna:'fu'
则不是。

这一切都与语句的解析方式有关。语句(不是表达式)以
{
开头的是语句块。当
{
出现在表达式中时,它会引入一个对象文本

声明:

{ foo: 'bar' }
{
   foo: 'bar'
}
语法正确,但在解释为语句和解释为表达式时语义不同。在前一种情况下,它是block语句:

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


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

当您在REPL中按enter键时,我猜它需要一个表达式,并且可能执行类似于在parens中包装语句的操作。编辑:有趣…确认
{foo:'bar',sna:'fu'}
不计算。