Le point-virgule en JavaScript est facultatif. L'ajout ou non d'un point-virgule est principalement une question de style de codage, mais ne l'ajoutez pas pendant un moment et ne l'ajoutez pas pendant un moment. Habituellement, si une instruction commence par "(", "[", "/", "+", "-", elle peut être interprétée comme faisant partie de la ligne d'instructions précédente ; dans ce cas, vous pouvez ajouter un saut de manière défensive. au début de la ligne.
L'environnement d'exploitation de ce tutoriel : système Windows 7, version JavaScript 1.8.5, ordinateur Dell G3
Le point-virgule en JavaScript est facultatif. ou non est principalement une question de style de codage. Un style consiste à utiliser des points-virgules pour terminer explicitement les instructions, même si elles ne sont pas obligatoires ; un autre style consiste à utiliser le moins de points-virgules possible et à les ajouter uniquement lorsque cela est nécessaire. ne l'ajoutez pas, mais ne l'ajoutez pas pendant un moment et ne l'ajoutez pas pendant un moment
Le rôle du point-virgule dans le codeLa fonction principale du point-virgule est : comme assertion (EOS) de. une instruction, il est utilisé pour terminer une instruction de programme, le but est de permettre à l'analyseur d'analyser le programme correctement. Dans de nombreux langages de style C, l'utilisation d'un point-virgule pour terminer explicitement une ligne d'instructions vise principalement à réduire le coût de l'instruction. développement d'un compilateur de langage, mais les compilateurs modernes sont suffisamment intelligents pour gérer les instructions multilignes. De nombreux langages n'ont pas besoin d'utiliser explicitement des terminaisons de point-virgule, telles que : Go, Scala, Ruby, Python, Swift, Groovy, etc.
Bien que JavaScript soit un langage de type C, il est différent de C et Java. Oui, le point-virgule est également facultatif en JavaScript, il dispose d'un mécanisme d'insertion automatique de point-virgule (insertion automatique de point-virgule (ASI)), appelé ASI). . Une description claire de l'insertion automatique de point-virgule dans ECMA-262 - Insertion automatique de point-virgule :
Analysez le programme de gauche à droite, lorsque vous rencontrez un jeton (jeton incriminé) qui n'est conforme à aucune production grammaticale, alors un point-virgule est. automatiquement inséré devant le jeton incriminé tant qu'une des conditions suivantes est remplie Au moins un caractère de nouvelle ligne (LineTerminator) sépare le jeton incriminé du jeton précédentLe jeton incriminé est }<.>. <span style="font-size: 18px;"></span></.>
Analysez le programme de gauche à droite et rencontrez un jeton autorisé par certaines productions grammaticales, mais il s'agit d'une opération restreinte (Productions restreintes). Lorsqu'au moins un caractère de nouvelle ligne sépare le jeton restreint du jeton précédent, alors. Un point-virgule est automatiquement inséré devant les jetons restreints.
La situation de l'insertion automatique de point-virgule}
。
从左到右解析程序,tokens 输入流已经结束,当解析器无法将输入 token 流解析成单个完整 ECMAScript 程序 ,那么就在输入流的结束位置自动插入分号。
从左到右解析程序,遇到一个某些文法产生式允许的 token,但是它是受限操作(Restricted Productions),当至少一个换行符分割了受限的 token 和前一个 token,那么就在受限 token 前面自动插入分号。
然而,上述规则有一个附加的优先条件:如果插入分号后解析结果是空语句,或如果插入分号后它成为 for 语句头部的两个分号之一,那么不会自动插入分号。
注:以上说明翻译较为别扭可以多读几遍或阅读英文原文 ECMA-262 - Automatic Semicolon Insertion
分号自动插入的情况
简要归纳下,自动分号插入以换行为基础,解析器会尽量将新行并入当前行,当且仅当符合 ASI 规则时才会将新行视为独立的语句
主要有以下自动插入规则:
当新的一行并入当前行将构成非法语句不能正确解析时,将自动插入分号
当新行以}
开头时,即代码块的结束位置,将自动插入分号
当以return
语句结束时,在行末自动插入分号
当以break
语句结束时,在行末自动插入分号
当以throw
语句结束时,在行末自动插入分号
当以continu
e语句结束时,在行末自动插入分号
当以 ES6 的 yield 语句结尾时,在行末自动插入分号
++
、--
后缀表达式作为新行的开始,在行首自动插入分号
源代码文件末尾自动插入号
如上所示,如果没加分号,运行这段代码这段代码将报错。
不能省略分号的情况
通常,如果语句以(
、[
、 /
、+
、-
开头时,就有可能被解释为上一行语句的一部分。实际中以/
、+
、-
开头的语句很少。但是以(
、[
}
, qui est la fin du bloc de code, un point-virgule sera automatiquement inséré 🎜🎜🎜🎜Lorsque vous terminez par une instruction return
, un point-virgule est automatiquement inséré à. la fin de la ligne🎜🎜🎜🎜Lorsque vous terminez par une instruction break
, un point-virgule est automatiquement inséré à la fin de la ligne🎜 🎜🎜🎜Lorsque vous terminez par un throw
instruction, un point-virgule est automatiquement inséré à la fin de la ligne🎜🎜🎜🎜Lorsque vous terminez par une instruction continu
e, un point-virgule est automatiquement inséré à la fin de la ligne🎜🎜 🎜🎜Lorsque vous terminez par une instruction rendement ES6, un point-virgule est automatiquement inséré à la fin de la ligne🎜🎜🎜🎜++
, expression de suffixe --
comme début d'une nouvelle ligne, à Un point-virgule est automatiquement inséré au début de la ligne 🎜🎜🎜🎜 à la fin du fichier de code source, s'il n'y a pas de point-virgule, une erreur sera signalée lors de l'exécution de ce code. 🎜🎜🎜🎜Cas dans lequel le point-virgule ne peut être omis🎜🎜🎜🎜Habituellement, si l'instruction commence par (
, [
, /
, + Lorsqu'il commence par
, -
, cela peut être interprété comme faisant partie de la ligne d'instructions précédente. En fait, il commence par /
, +
, <. il existe tr peu d commen par code>-, mais les instructions commençant par (
, [
sont très courantes , et je peux généralement les ajouter de manière défensive au début de la ligne 🎜.Plus tôt, nous avons découvert l'insertion automatique de points-virgules, regardons maintenant quelques exemples
let hey = 'hey' ['liu','liuxing'].forEach(console.log)
Pensez une seconde au résultat ci-dessus ? L'exécution de ce code lancera
Uncaught TypeError: Cannot read property 'forEach' of undefined
Basé sur la règle 1. Le code ci-dessus sera analysé dans le code suivant
let hey = 'hey'['liu','liuxing'].forEach(console.log)
On peut voir qu'en utilisant une instruction commençant par [
sans point-virgule devant cela est susceptible de provoquer un problème. [
开头的语句,前面没有分号,很可能导致出错。
再来看一个(
开头的语句的示例代码
const a = 1 const b = 2 const c = a + b (a + b).toString()
你会以为上面的代码结果是“3”吗?但是实际上它会抛出错误b is not a function
,因为根据 ASI 规则,它会被解析成如下代码:
const a = 1;const b = 2;const c = a + b(a + b).toString()
我们就不一一介绍/
, +
, -
作为语句开头的情况了,这种情况比较少,大家可以自己试试。只需要记住语句以(
、[
、 /
、+
、-
开头时,语句前需要加上分号即可!
下面再在看看使用return的情况,
(() => { return { name: 'Liu Xing' } })()
你的期待值是不是返回一个带有 name
的对象,但是它却返回了undefined
。这是 ASI 自动在return
给加上了分号。在这儿就得正确的换行以确保代码正确运行。我们可以看出除了正确的的分号,我们还需要正确合理的换行来使代码结构更为清晰。
总结
我们了解了 JavaScript 的分号自动插入机制,知道了 JavaScript 什么时候会自动加入分号,在(
、[
、 /
、+
、-
(
rrreeePensez-vous que le résultat du code ci-dessus est "3" ? Mais en fait, cela générera l'erreur b n'est pas une fonction
, car selon les règles ASI, elle sera analysée dans le code suivant : rrreeeNous n'introduireons pas /
, +
, - un par un. est utilisé comme début d'une instruction. Cette situation est relativement rare. Vous pouvez l'essayer vous-même. Il vous suffit de vous rappeler que l'instruction commence par (
). , [
, Lorsque vous commencez par /
, +
, -
, vous devez ajouter un point-virgule avant l'instruction. !
name
, mais il renvoie undefined
. par ASI dans return
. Un point-virgule est ajouté ici. Des sauts de ligne corrects sont nécessaires pour garantir que le code s'exécute correctement. Nous pouvons voir qu'en plus des points-virgules corrects, nous avons également besoin de sauts de ligne corrects et raisonnables. rendre la structure du code plus claire 🎜Résumé🎜🎜Nous. avez découvert le mécanisme d'insertion automatique de point-virgule de JavaScript. Sachez quand JavaScript ajoutera automatiquement des points-virgules, dans (
, [
, /
, +<.>, <code>-
Nous devons ajouter un point-virgule avec précision au début. Le mécanisme d'insertion automatique de point-virgule nous offre deux options. Cela dépend de vos préférences ou de celles de votre équipe. tels que plus joli et Eslint peuvent automatiquement unifier les styles 🎜🎜【Recommandations associées : 🎜Tutoriel vidéo javascript🎜, 🎜Vidéo de programmation de base🎜】🎜
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!