为什么Node REPL和在脚本上运行的Node引擎如何解释以下表达式之间存在差异:{...a}
?
我正在运行节点v8.3.0
(通过运行node -v
发现),并发现命令行解释和扩展运算符的脚本解释之间存在奇怪的差异。
考虑以下:
$ node -v
v8.3.0
$ node
(获取节点的版本,然后运行节点解释器)
> const a = {foo: 'bar'};
undefined
> {...a};
{ foo: 'bar' }
(创建一个对象文字并将其存储在const a
中。然后,创建另一个对象文字并在spread operator
上填充a
。
到现在为止还挺好。但是,如果你创建一个file.js
:
const a = { foo: 'bar' };
{...a};
并运行> node file.js
,结果是一个SyntaxError: Unexpected token ...
。
我可能正在回答我自己的问题,但我目前的操作理论是Node通常将{
和}
解释为可执行代码块,而Node实时解释器主要寻找独立表达式。 (This的回答暗示一切都被包裹起来,我怀疑,因为多线代码块是可能的,但他可能在正确的轨道上)。
但是,如果是这种情况,为什么{ foo: 'bar' }
(独立)在REPL和Node脚本中评估没有错误?
以下在REPL和Node脚本中执行时没有错误:
[1, 2, 3]
[...a]
{foo: 'bar'}
但这在Node中失败了:
{...b}
差价运营商引入了什么区别?
编辑:根据Pointy,{foo: 'bar'}
确实评估独立,但{ foo: 'bar', sna: 'fu' }
没有。 Node将大括号之间的代码解释为代码块,而foo: 'bar'
是有效的Javascript表达式,而...a
和foo: 'bar', sna: 'fu'
则不是。
这一切都与解析语句的方式有关。以{
开头的语句(不是表达式)是一个语句块。当{
出现在表达式中时,它会引入一个对象文字。
该声明:
{ foo: 'bar' }
在语法上是正确的,但在解释为语句和解释为表达式时在语义上是不同的。在前一种情况下,它是块语句:
{
foo: 'bar'
}
这是一个包含一个语句的块,标记的表达式为'bar'
。它不是一个对象字面量。
当{...a}
引入语句块时,表达式{
失败,因为...a
本身不能被解析为语句。