【问题标题】:Why does Node.js/JavaScript evaluate a:1 to 1?为什么 Node.js/JavaScript 将 a:1 评估为 1?
【发布时间】:2019-08-28 05:58:55
【问题描述】:

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

> a:1
1

试图分配给变量会抛出错误:

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

SyntaxError: Unexpected token :

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

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

在 Node.js REPL 中:

> a:
... 3
3

【问题讨论】:

  • 我无法在 Chrome 的控制台中重新输入 a:,从而导致 Uncaught SyntaxError: Unexpected token }(…)。相反,当我按下回车键时,我得到一个新行 - 它提示我完成语句,而不是运行到目前为止输入的代码。
  • @CertainPerformance 这可能是我的旧 Chrome。

标签: javascript node.js console token unexpected-token


【解决方案1】:

当a 的开头被解析为 statement 的开头时,它被解释为一个 label(可以用来突破嵌套循环)。

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 的开头不是语句开头的not,则不能将其解析为标签,因此冒号仅作为键值对的一部分才有意义 -因此,如果要解析的 Javascript 文本不是对象文字的一部分,它将引发语法错误,就像您的 x = a:1 代码一样。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2012-03-06
    • 2021-11-01
    • 2019-03-25
    相关资源
    最近更新 更多