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