为什么 Node.js/JavaScript 将 a:1 计算为 1?
Why does Node.js/JavaScript evaluate a:1 to 1?
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
当 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,拒绝执行代码,并且而只是给我一个新的行来继续打字)。
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
当 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,拒绝执行代码,并且而只是给我一个新的行来继续打字)。