JavaScript解释器忽略语法错误

JavaScript解释器忽略语法错误,javascript,syntax-error,Javascript,Syntax Error,这段代码显然有缺陷: if (5 > 2) { console.log("5 > 2"); } else (5 < 2) { console.log("5 < 2"); } 此输出中的结果(在chrome和firefox中测试): 5>2 5 < 2 这怎么可能?为什么不将此else视为语法错误?区别在于,在第二种情况下,回车符使第二个带括号的块成为独立块,而不是else子句的一部分,其中括号部分是else子句。第二种情况相当于: if (5 > 2)

这段代码显然有缺陷:

if (5 > 2) {
  console.log("5 > 2");
} else (5 < 2) {
  console.log("5 < 2");
}
此输出中的结果(在chrome和firefox中测试):

5>2
5 < 2

这怎么可能?为什么不将此
else
视为语法错误?

区别在于,在第二种情况下,回车符使第二个带括号的块成为独立块,而不是else子句的一部分,其中括号部分是else子句。第二种情况相当于:

if (5 > 2) {
    console.log("5 > 2");
} else {
    (5 < 2)
}

{
    console.log("5 < 2");
}
if(5>2){
控制台日志(“5>2”);
}否则{
(5 < 2)
}
{
控制台日志(“5<2”);
}
这只是:

if (5 > 2) {
    console.log("5 > 2");
} else {
    false
}

console.log("5 < 2");
if(5>2){
控制台日志(“5>2”);
}否则{
假的
}
控制台日志(“5<2”);
这都是因为,当您将此大括号转移到下一行时,JS引擎会将您的代码“翻译”为:

if (5 > 2) {
  console.log("5 > 2");
} else (5 < 2);
{
  console.log("5 < 2");
}
if(5>2){
控制台日志(“5>2”);
}其余(5<2);
{
控制台日志(“5<2”);
}

这显然是正确的,因为JS允许放置独立块。

不同解释的原因是:

  • 当从左到右解析程序时,遇到任何语法生成都不允许的标记(称为违规标记),如果满足以下一个或多个条件,则会自动在违规标记之前插入分号:

    • 至少有一个LineTerminator将有问题的标记与前一个标记分隔开
    • 有问题的令牌是
      }
  • 在您的例子中,有问题的标记是
    {
    。在代码的第一个版本中,上面引用的要点条件都不是真的,因此没有插入分号,并引发语法错误

    在代码的第二个示例中,有一个行终止符,如第一个条件中所述。在这种情况下,会自动插入分号,因此解析后的代码实际上是这样的:

    if (5 > 2) {
      console.log("5 > 2");
    } else (5 < 2);
    {
      console.log("5 < 2");
    }
    
    if(5>2){
    控制台日志(“5>2”);
    }其余(5<2);
    {
    控制台日志(“5<2”);
    }
    
    现在,代码是有效的,因为分号后面的大括号被解释为不属于
    else
    后面表达式的代码块的开头


    请注意,即使此代码现在已解析,
    else
    部分中的表达式显然没有任何效果。

    看起来是正确的。第二个块
    {console.log(“5<2”);}
    根本不被视为else的一部分……而
    (5<2)
    则是无效的,就像
    else{(5非常感谢您提供如此快速完整的答案:)当自动美化后的代码产生不同的输出时,我感到非常震惊。不客气。“自动插入逗号”确实是JavaScript中不太受欢迎的语法规则之一。
    
    if (5 > 2) {
      console.log("5 > 2");
    } else (5 < 2);
    {
      console.log("5 < 2");
    }
    
    if (5 > 2) {
      console.log("5 > 2");
    } else (5 < 2);
    {
      console.log("5 < 2");
    }