为什么Node.js / JavaScript评估a:1到1?

Dmi*_*sev 1 javascript console token node.js unexpected-token

Node.js / JavaScript控制台中此评估背后的任何解释:

> a:1
1
Run Code Online (Sandbox Code Playgroud)

尝试分配给变量引发错误:

> x = a:1
Thrown:
x = a:1
     ^

SyntaxError: Unexpected token :
Run Code Online (Sandbox Code Playgroud)

就像只留a:在JS控制台中一样:

a:
VM138:3 Uncaught SyntaxError: Unexpected token }(…)
Run Code Online (Sandbox Code Playgroud)

在Node.js REPL中:

> a:
... 3
3
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 5

将的开头a解析为语句的开头时,它将被解释为标签(可以用来打破嵌套循环的标签)。

outer:
for (let i = 0; i < 10; i++) {
  console.log('outer loop iteration');
  for (let j = 0; j < 10; j++) {
    if (i === 3) {
      break outer;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,不幸的是,即使标签未连接到循环,标签也是允许的,因此在标签上似乎什么也没做的事情不会引发语法错误。结果,线

a:1
Run Code Online (Sandbox Code Playgroud)

被解释为

a: // label named a
1  // unused expression
Run Code Online (Sandbox Code Playgroud)

如果所涉及的起动a不是在声明的开头,它不能被解析为一个标签,所以结肠才有意义的键值对的一部分-所以,如果被解析JavaScript的文字是不是对象的一部分文字,它将引发语法错误,就像处理您的x = a:1代码一样。

对于控制台,除非标签后面跟着可能使用标签的代码,否则标签没有任何意义。如果您在控制台中键入代码,并且该代码在顶层包含一个标签,则只有在刚输入的代码运行时,才会定义该标签。因此,在此类代码中将标签定义为最后一行将导致该标签永远无法访问,这可能就是控制台抛出错误的原因(或者,在我的情况下,在Chrome 76上,它拒绝执行代码,而只是给了我新行以继续输入)。