为什么在评估这些表达式时节点 REPL 和节点脚本 运行 之间存在差异
Why are there differences between the node REPL and node script running when evaluating these expressions
为什么 Node REPL 和在脚本上运行的 Node 引擎解释以下表达式的方式不同:{...a}
?
我是 运行ning 节点 v8.3.0
(由 运行ning node -v
发现)并且发现命令行解释和脚本解释之间存在奇怪的差异传播运营商。
考虑以下几点:
$ node -v
v8.3.0
$ node
(获取节点版本然后运行安装节点解释器)
> const a = {foo: 'bar'};
undefined
> {...a};
{ foo: 'bar' }
(创建一个对象字面量并将其存储在 const a
中。然后,创建另一个对象字面量并在 a
上填充 spread operator
。
到目前为止一切顺利。但是如果你创建一个 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'}
但这在节点中失败了:
{...b}
传播运算符有什么区别?
编辑:根据 Pointy、{foo: 'bar'}
独立评估,但 { foo: 'bar', sna: 'fu' }
没有。 Node 将大括号之间的代码解释为代码块,foo: 'bar'
是有效的 Javascript 表达式,而 ...a
和 foo: 'bar', sna: 'fu'
不是。
这一切都与 语句 的解析方式有关。以 {
开头的语句(不是 表达式 )是一个语句块。当 {
出现在表达式中时,它引入了一个对象文字。
声明:
{ foo: 'bar' }
在语法上是正确的,但在解释为语句和解释为表达式时在语义上有所不同。在前一种情况下,它是块语句:
{
foo: 'bar'
}
这是一个包含一个语句的块,标记为表达式 'bar'
。它不是对象字面量。
当 {
引入语句块时,表达式 {...a}
失败,因为 ...a
本身不能被解析为语句。
为什么 Node REPL 和在脚本上运行的 Node 引擎解释以下表达式的方式不同:{...a}
?
我是 运行ning 节点 v8.3.0
(由 运行ning node -v
发现)并且发现命令行解释和脚本解释之间存在奇怪的差异传播运营商。
考虑以下几点:
$ node -v
v8.3.0
$ node
(获取节点版本然后运行安装节点解释器)
> const a = {foo: 'bar'};
undefined
> {...a};
{ foo: 'bar' }
(创建一个对象字面量并将其存储在 const a
中。然后,创建另一个对象字面量并在 a
上填充 spread operator
。
到目前为止一切顺利。但是如果你创建一个 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'}
但这在节点中失败了:
{...b}
传播运算符有什么区别?
编辑:根据 Pointy、{foo: 'bar'}
独立评估,但 { foo: 'bar', sna: 'fu' }
没有。 Node 将大括号之间的代码解释为代码块,foo: 'bar'
是有效的 Javascript 表达式,而 ...a
和 foo: 'bar', sna: 'fu'
不是。
这一切都与 语句 的解析方式有关。以 {
开头的语句(不是 表达式 )是一个语句块。当 {
出现在表达式中时,它引入了一个对象文字。
声明:
{ foo: 'bar' }
在语法上是正确的,但在解释为语句和解释为表达式时在语义上有所不同。在前一种情况下,它是块语句:
{
foo: 'bar'
}
这是一个包含一个语句的块,标记为表达式 'bar'
。它不是对象字面量。
当 {
引入语句块时,表达式 {...a}
失败,因为 ...a
本身不能被解析为语句。