为什么在评估这些表达式时,节点REPL和节点脚本之间存在差异

时间:2018-01-04 15:25:57

标签: javascript node.js ecmascript-6 read-eval-print-loop ecma

为什么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表达式,而...afoo: 'bar', sna: 'fu'则不是。<input name="service[0][name]" value="Service-1" type="hidden"><input name="service[1][name]" value="Service-2" type="hidden">

1 个答案:

答案 0 :(得分:2)

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

声明:

{ foo: 'bar' }

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

{
   foo: 'bar'
}

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

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