Javascript 为什么在计算这些表达式时,节点REPL和运行的节点脚本之间存在差异
为什么Node 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' }; {...
{…a}
我正在运行nodev8.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'}
不计算。