自动分号插入(ASI)

在 C 系列语言中,分号表示语句的结束。与其他类似 C 的语言不同,JavaScript 并不强制要求分号的使用。相反,分号是可选的,解释器会自动插入缺失的分号——通常是在行末——以终止语句。在此过程中,解释器会考虑复杂的规则,这可能与开发者的预期产生冲突。

如果你在编写代码时没有在语句末尾加上分号,你必须小心可能出现的问题。以下是一些避免问题的经验法则,但实际上还有更多规则。

  1. returnthrowyield 关键字后面的表达式必须与关键字位于同一行。
  2. breakcontinue 后的标签标识符必须与关键字位于同一行。
  3. 如果一行以 ([`+-/ 开头,前一行必须以分号结尾。

示例

输入代码 解释后的代码 意图代码
return 2a + 1 return; 2a + 1; return 2*a + 1;
function getObject() { return { ... } } function getObject() { return; { ... } }; function getObject() { return { ... }; }
i++ i; ++i; i++;

在第一个示例中,程序员本意是返回 2*a + 1,但由于分号插入,代码返回了 undefined。同样,在第二个示例中,程序员打算返回大括号 {} 内的内容,但代码返回了 undefined。由于 JavaScript 中的这个怪异行为,最佳实践是避免在语句内换行,并且不要将左花括号 { 放在单独的一行。

参见

Last modified: Monday, 13 January 2025, 3:01 PM