JavaScript中的可选分号

发布时间 2023-08-19 09:16:37作者: 晓风晓浪

与许多编程语言一样,JavaScript使用分号(;)来分隔语句。这对于保持代码清晰非常重要:没有分号,一个语句的末尾可能会被解释为另一个语句的开头,反之亦然。在JavaScript中,如果两个语句写在不同的行上,通常可以省略它们之间的分号。此外,在程序的末尾,如果下一个标记是右花括号},您可以省略分号。许多JavaScript程序员使用分号来明确表示语句的结束,即使它们并不严格必要。另一种风格是尽量省略分号,只在必要的情况下使用它们。无论使用哪种风格,了解JavaScript中可选分号的一些细节很重要。

(程序员的软技能:ke.qq.com/course/6034346)

考虑以下代码。由于这两个语句位于不同的行上,第一个分号可以省略:

a = 3;
b = 4;

然而,像这样写需要分号:

a = 3; b = 4;

请注意,JavaScript并不将每个换行符都视为分号;只有在无法在不插入分号的情况下解析代码时,它才会这样做。更准确地说(除了后面讨论的三个例外情况),JavaScript仅在下一个非空格字符无法解释为当前语句的一部分时,将换行符视为分号。看一下这段代码:

let a
a
=
3
console.log(a)

上面的代码被解释为:

let a; a = 3; console.log(a);

第一个换行符被视为分号,是因为如果没有它,JavaScript无法解析代码let a a。第二个a被视为独立的语句,但JavaScript不会将第二个换行符视为分号,因为它可以继续解析更长的语句a = 3;

这些语句终止规则可能会导致意外情况。以下代码可能看起来是两个位于不同行上的语句:

let y = x + f
(a+b).toString()

然而,第二行的括号可以被解释为从第一行调用f(a+b)的函数调用。所以JavaScript将这些行解释为:

let y = x + f(a+b).toString();

这可能不是作者的意图。为确保代码被解释为两个独立的语句,必须在这里显式添加分号。

通常,如果语句以(、[、/、+或-开头,它可能被解释为前一个语句的延续。实际上,以/、+或-开头的语句非常少见,但以(和[开头的语句并不少见,尤其是在某些JavaScript编码风格中。一些程序员喜欢在所有这些语句之前防御性地添加分号。这样,即使修改了前面的语句并删除了末尾的分号,也不会影响当前语句:

// 此处省略分号
let x = 0
// 防御性:确保此语句是独立的
;[x,x+1,x+2].forEach(console.log)

JavaScript有三个例外,涉及到当无法将代码解释为连续语句时,它如何将换行符视为分号。第一个例外涉及return、throw、yield、break和continue语句。这些语句通常是独立的,但有时可以跟随标识符或表达式。如果其中任何一个单词后面跟着一个换行符(没有其他标记在中间),JavaScript将该换行符视为分号。例如,如果写入:

return
true;

JavaScript会假定您的意思是:

return; true;

但您的意图可能是:

return true;

这意味着您绝不能在关键字(如return、break或continue)和其后的表达式之间插入换行符。如果这样做,调试错误可能会变得具有挑战性,因为问题并不明显。

第二个例外涉及++和--运算符。这些运算符可以是前缀或后缀。如果要将它们用作后缀运算符,它们必须与应用它们的表达式在同一行上。第三个例外涉及使用简洁的“箭头”语法定义的函数:箭头=>必须与参数列表在同一行上。

(程序员的软技能:ke.qq.com/course/6034346)