这段简短的代码显然有问题:
if (5 > 2) {
console.log("5 > 2");
} else (5 < 2) {
console.log("5 < 2");
}
不应指定else
的条件。正如预期的那样,执行此代码将导致SyntaxError: Unexpected token {
。
问题在于,经过微小的改动(将左支架转移到新线)后,解释器将忽略语法错误。
此代码:
if (5 > 2) {
console.log("5 > 2");
} else (5 < 2)
{
console.log("5 < 2");
}
导致此输出(在chrome和firefox中测试):
5 > 2
5 < 2
这怎么可能?为什么不将此else
视为语法错误?
答案 0 :(得分:6)
不同之处在于,在第二种情况下,回车使第二个支撑块成为独立块,而不是其中括号部分是else子句的else子句的一部分。第二种情况相当于:
if (5 > 2) {
console.log("5 > 2");
} else {
(5 < 2)
}
{
console.log("5 < 2");
}
只是:
if (5 > 2) {
console.log("5 > 2");
} else {
false
}
console.log("5 < 2");
答案 1 :(得分:3)
全部是因为Automatic Semicolon Insertion,当您将此大括号转移到下一行时,JS引擎会将您的代码“翻译”为:
if (5 > 2) {
console.log("5 > 2");
} else (5 < 2);
{
console.log("5 < 2");
}
这显然是正确的,因为JS允许放置独立的块。
答案 2 :(得分:3)
不同解释的原因是ECMAScript Rules of Automatic Semicolon Insertion:
中的第一个
- 醇>
当从左到右解析程序时,遇到任何语法生成不允许的令牌(称为违规令牌),然后在违规令牌之前自动插入分号,如果满足以下一个或多个条件:
- 违规令牌通过至少一个LineTerminator与前一个令牌分开。
- 违规令牌为
}
。
在您的情况下,违规令牌为{
。在代码的第一个版本中,上面引用的项目符号条件都不是真的,因此不会插入分号,并且会引发语法错误。
在代码的第二个示例中,有一个行终止符,如第一个条件中所述。在这种情况下,会自动插入分号,因此解析后的代码实际上就是这样:
if (5 > 2) {
console.log("5 > 2");
} else (5 < 2);
{
console.log("5 < 2");
}
现在代码有效,因为分号后面的左括号被解释为代码块的开头,而不是else
之后的表达式的一部分。
请注意,即使此代码现在解析,很明显else
部分中的表达式也没有效果。