JavaScript中分号的一些细节。
JavaScript中的分号是可选的,是否增加额外的标记主要是代码风格的问题。一种风格是用分号显式结束语句,即使这些分号不是必需的;另一种风格是尽可能不添加额外的标记,只在必要时添加。个人不喜欢加分。当然,很多朋友喜欢加分。不管你喜欢哪种风格,你都需要知道一些关于JavaScript中分号的细节。
代码中分号的作用
分号的主要功能是将程序语句作为断言(EOS)结束,这样解析器就可以正确解析程序。在许多C-Style语言中,分号用于显式结束一行语句,主要是为了降低语言编译器的开发成本。但是现代编译器足够聪明,可以处理多行语句。很多语言不需要明确以分号结尾,比如Go、Scala、Ruby、Python、Swift、Groovy等等。
尽管JavaScript是一种类似C的语言,但它不同于C和Java。分号在JavaScript中也是可选的。它有一个自动分号插入机制,自动分号插入(ASI)。
JavaScript 自动分号插入机制
JavaScript有自动分号插入机制(简称ASI)。ECMA-262-自动半殖民地插入的明确描述:
从左到右,当解析器遇到不符合任何语法的标记(提供标记)时,只要满足以下条件之一,它就会自动在有问题的标记前面插入分号。
至少有一个行终止符将违规令牌与前一个令牌分开。
违规令牌为}。
从左到右解析程序,令牌输入流已经结束。当解析器无法将输入令牌流解析为一个完整的ECMAScript程序时,会在输入流的末尾自动插入一个分号。
从左到右,解析器遇到了一些语法表达式允许的标记,但它是受限产品。当至少有一个换行符将受限令牌与前一个令牌分开时,会在受限令牌前面自动插入一个分号。
但是,上面的规则有一个附加的优先级条件:如果在插入分号后解析结果是一个空语句,或者在插入分号后它变成for语句头的两个分号之一,则不会自动插入分号。
注:以上说明翻译比较别扭。可以多看几遍,也可以看英文原版ECMA-262-自动分号插入。
分号自动插入的情况
综上所述,使用自动分号插入来换取行为基础,解析器会尽力将新行合并到当前行中,新行只有满足ASI规则才会被视为独立语句。
主要有以下自动插入规则:
当一个新的行被合并到当前行中时,这构成了一个非法的语句,并且不能被正确解析,分号将被自动插入。
当一个新的行以{开始,这是代码块的结束位置,分号会自动插入。
当return语句结束时,会自动在行尾插入一个分号。
当break语句结束时,会自动在行尾插入一个分号。
当以throw语句结束时,分号会自动插入到行尾。
以continue语句结束时,在行尾自动插入分号。
以ES6的yield语句结尾时,在行尾自动插入分号。
-后缀表达式用作新行的开头,并且在该行的开头自动插入分号。
源代码文件末尾的自动插入号。
如上所示,如果没有额外的符号,该代码将在运行时报告错误。
不能省略分号的情况
通常,如果一条语句以(,[,/,-,`)开头,它可能被解释为前一条语句的一部分。实际上,很少有以/、-。但是,以(,[开头的语句非常常见。通常,我可以在行首防御性地添加一个分号。
之前,我们学习了分号的自动插入。现在我们来看一些例子。
让嘿='嘿'
['刘','刘星']。forEach(控制台. log)
想一想上面的结果是什么。运行此代码将引发。
未捕获类型错误:无法读取未定义的属性“forEach”
基于规则1,上面的代码将被解析为下面的代码。
让嘿='嘿'['刘','刘星']。forEach(控制台. log)
可以看出,以[开头的语句前面没有分号,这可能会导致错误。
让我们看看开头的语句的示例代码。
常量a=1
常数b=2
常数c=a b
(a)b。toString()
你以为上面代码的结果是“3”但实际上它会抛出一个错误b不是函数,因为根据ASI规则,它会被解析成下面的代码:
const a=1;const b=2;const c=a b(a b)。toString()
我们不介绍/,-作为句子的开头,这种情况比较少见,大家可以自己试试。请记住,当语句以(,[,/,-,`)开头时,语句前需要一个分号!
我们来看看return的用法。
(()={
返回
{
姓名: '刘星'
}
})()
您的预期值是否返回一个名为的对象,但它返回未定义。这是ASI自动添加分号返回。在这里,您必须正确包装行,以确保代码正确运行。我们可以看到,除了正确的分号之外,我们还需要正确合理地换行,以使代码结构更加清晰。
总结
我们知道JavaScript的自动分号插入机制,以及JavaScript什么时候会自动添加分号。我们需要在(,[,/,-,`)的开头准确地添加分号。自动分号插入机制为我们提供了两种选择。是否添加额外的分数完全取决于您或您的团队的偏好。现在我们也有了更漂亮的、Eslint等工具来自动统一风格。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/70031.html