1

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

> a:1
1

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

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

SyntaxError: Unexpected token :

正如仅a:在 JS 控制台中留下的那样:

a:
VM138:3 Uncaught SyntaxError: Unexpected token }(…)

在 Node.js REPL 中:

> a:
... 3
3
4

1 回答 1

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;
    }
  }
}

但是,不幸的是,即使标签没有连接到循环,标签也是允许的,所以有一个似乎没有做任何事情的标签不会引发语法错误。结果,线

a:1

被解释为

a: // label named a
1  // unused expression

如果开头a不是语句的开头,则不能将其解析为标签,因此冒号仅作为键值对的一部分才有意义-因此,如果要解析的 Javascript 文本不是对象的一部分文字,它会抛出一个语法错误,就像你的x = a:1代码一样。

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

于 2019-08-28T06:00:59.860 回答