Sollte JavaScript ein Semikolon hinzufügen?

青灯夜游
Freigeben: 2022-09-29 17:25:04
Original
3376 Leute haben es durchsucht

Das Semikolon in JavaScript ist optional. Ob ein Semikolon hinzugefügt werden soll oder nicht, hängt hauptsächlich vom Codierungsstil ab. Fügen Sie es jedoch für eine Weile nicht hinzu. Wenn eine Anweisung mit „(“, „[“, „/“, „+“, „-“ beginnt, kann sie normalerweise als Teil der vorherigen Anweisungszeile interpretiert werden; in diesem Fall können Sie defensiv eine Pause hinzufügen am Anfang der Zeile.

Sollte JavaScript ein Semikolon hinzufügen?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, JavaScript-Version 1.8.5, Dell G3-Computer

Das Semikolon in JavaScript ist optional Ein Stil besteht darin, Semikolons explizit zu verwenden, um Anweisungen zu beenden, auch wenn sie nicht erforderlich sind. Ein anderer Stil besteht darin, Semikolons so wenig wie möglich zu verwenden und sie nur bei Bedarf hinzuzufügen Fügen Sie es nicht hinzu, aber fügen Sie es für eine Weile nicht hinzu.

Sollte JavaScript ein Semikolon hinzufügen?

Die Rolle des Semikolons im Code

Die Hauptfunktion des Semikolons ist: als Behauptung (EOS) von Eine Anweisung wird zum Beenden einer Programmanweisung verwendet. Der Zweck besteht darin, dem Parser das korrekte Parsen des Programms zu ermöglichen. In vielen C-Stil-Sprachen dient die Verwendung eines Semikolons zum expliziten Beenden einer Anweisungszeile hauptsächlich dazu, die Kosten zu senken Sprachcompilerentwicklung, aber moderne Compiler sind intelligent genug, um mehrzeilige Anweisungen zu verarbeiten, wie zum Beispiel: Go, Scala, Ruby, Python, Swift, Groovy usw.

Obwohl JavaScript eine C-ähnliche Sprache ist, unterscheidet sie sich von C und Java. Ja, Semikolon ist in JavaScript ebenfalls optional, es verfügt über einen automatischen Semikolon-Einfügungsmechanismus (Automatic Semicolon Insertion, ASI). . Eine klare Beschreibung der automatischen Semikolon-Einfügung in ECMA-262 – Automatische Semikolon-Einfügung:

Parsen Sie das Programm von links nach rechts. Wenn Sie auf ein Token (anstößiges Token) stoßen, das keiner grammatikalischen Produktion entspricht, ist dies ein Semikolon Wird automatisch vor dem fehlerhaften Token eingefügt, solange eine der folgenden Bedingungen erfüllt ist:

Mindestens ein Zeilenumbruchzeichen (LineTerminator) trennt das fehlerhafte Token vom vorherigen Token.

Der fehlerhafte Token ist }

Parsen Sie das Programm von links nach rechts. Wenn der Parser den Eingabe-Token-Stream nicht in ein einzelnes vollständiges ECMAScript-Programm analysieren kann, wird am Ende automatisch ein Semikolon eingefügt Eingabestrom.

Parsen Sie das Programm von links nach rechts und stoßen Sie auf ein Token, das von bestimmten Grammatikproduktionen zugelassen wird, es sich jedoch um eine eingeschränkte Operation handelt (eingeschränkte Produktionen). Wenn mindestens ein Zeilenumbruchzeichen das eingeschränkte Token vom vorherigen Token trennt Vor eingeschränkten Token wird automatisch ein Semikolon eingefügt.

    Die obige Regel hat jedoch eine zusätzliche Vorrangbedingung: Wenn das Semikolon eingefügt wird und das analysierte Ergebnis eine leere Anweisung ist, oder wenn das Semikolon eingefügt wird und es zu einem der beiden Semikolons am Kopf der for-Anweisung wird, dann Das Semikolon wird nicht automatisch eingefügt.
  • Hinweis: Die Übersetzung der obigen Beschreibung ist umständlich. Sie können sie ein paar Mal lesen oder den englischen Originaltext ECMA-262 - Automatische Semikolon-Einfügung lesen Zusammenfassend sieht das automatische Einfügen von Semikolons wie folgt aus: Basierend auf dem Zeilenumbruch versucht der Parser, die neue Zeile genau dann mit der aktuellen Zeile zusammenzuführen, wenn sie den ASI-Regeln entspricht

Die wichtigsten Regeln für das automatische Einfügen lauten wie folgt:

}

  • 从左到右解析程序,tokens 输入流已经结束,当解析器无法将输入 token 流解析成单个完整 ECMAScript 程序 ,那么就在输入流的结束位置自动插入分号。

  • 从左到右解析程序,遇到一个某些文法产生式允许的 token,但是它是受限操作(Restricted Productions),当至少一个换行符分割了受限的 token 和前一个 token,那么就在受限 token 前面自动插入分号。

    然而,上述规则有一个附加的优先条件:如果插入分号后解析结果是空语句,或如果插入分号后它成为 for 语句头部的两个分号之一,那么不会自动插入分号。

注:以上说明翻译较为别扭可以多读几遍或阅读英文原文 ECMA-262 - Automatic Semicolon Insertion

分号自动插入的情况

简要归纳下,自动分号插入以换行为基础,解析器会尽量将新行并入当前行,当且仅当符合 ASI 规则时才会将新行视为独立的语句

主要有以下自动插入规则:

  • 当新的一行并入当前行将构成非法语句不能正确解析时,将自动插入分号

  • 当新行以}开头时,即代码块的结束位置,将自动插入分号

  • 当以return语句结束时,在行末自动插入分号

  • 当以break语句结束时,在行末自动插入分号

  • 当以throw语句结束时,在行末自动插入分号

  • 当以continue语句结束时,在行末自动插入分号

  • 当以 ES6 的 yield 语句结尾时,在行末自动插入分号

  • ++-- 后缀表达式作为新行的开始,在行首自动插入分号

  • 源代码文件末尾自动插入号

如上所示,如果没加分号,运行这段代码这段代码将报错。

不能省略分号的情况

通常,如果语句以([/+-开头时,就有可能被解释为上一行语句的一部分。实际中以/+-开头的语句很少。但是以([

🎜🎜Wenn eine neue Zeile, die mit der aktuellen Zeile zusammengeführt wird, eine ungültige Anweisung darstellt und nicht korrekt analysiert werden kann, wird automatisch ein Semikolon eingefügt🎜🎜🎜🎜Wenn eine neue Zeile beginnt Mit , dem Ende des Codeblocks, wird automatisch ein Semikolon eingefügt. 🎜🎜🎜🎜Wenn es mit einer return-Anweisung endet, wird automatisch ein Semikolon eingefügt am Ende der Zeile🎜🎜🎜🎜Wenn sie mit einer break-Anweisung endet, wird automatisch ein Semikolon am Ende der Zeile eingefügt🎜 🎜🎜🎜Wenn sie mit einer throw endet code>-Anweisung wird am Ende der Zeile automatisch ein Semikolon eingefügt Wenn Sie mit einer ES6-Yield-Anweisung enden, wird am Ende der Zeile automatisch ein Semikolon eingefügt🎜🎜🎜🎜<code>++, -- Suffixausdruck als Anfang einer neuen Zeile , at Am Anfang der Zeile 🎜🎜🎜🎜 am Ende der Quellcodedatei wird automatisch ein Semikolon eingefügt. Wie oben gezeigt, wird beim Ausführen dieses Codes ein Fehler gemeldet. 🎜🎜🎜🎜Fall, in dem das Semikolon nicht weggelassen werden darf🎜🎜🎜🎜Wenn die Anweisung normalerweise mit (, [, /, + Wenn es mit , - beginnt, kann es als Teil der vorherigen Anweisungszeile interpretiert werden. Tatsächlich beginnt es mit /,. +, <. es gibt nur sehr wenige anweisungen die mit code>- beginnen, aber Anweisungen, die mit (, [) beginnen, sind sehr häufig , und ich kann sie normalerweise defensiv am Anfang der Zeile hinzufügen 🎜

Zuvor haben wir etwas über das automatische Einfügen von Semikolons gelernt, jetzt schauen wir uns einige Beispiele an

let hey = &#39;hey&#39;
[&#39;liu&#39;,&#39;liuxing&#39;].forEach(console.log)
Nach dem Login kopieren

Denken Sie einen Moment über das obige Ergebnis nach? Das Ausführen dieses Codes löst

Uncaught TypeError: Cannot read property &#39;forEach&#39; of undefined
Nach dem Login kopieren

Basierend auf Regel 1 aus. Der obige Code wird in den folgenden Code analysiert

let hey = &#39;hey&#39;[&#39;liu&#39;,&#39;liuxing&#39;].forEach(console.log)
Nach dem Login kopieren

Es ist ersichtlich, dass eine Anweisung verwendet wird, die mit [ beginnt, ohne ein Semikolon davor Es ist wahrscheinlich, dass etwas schief gelaufen ist. [开头的语句,前面没有分号,很可能导致出错。

再来看一个(开头的语句的示例代码

const a = 1
const b = 2
const c = a + b
(a + b).toString()
Nach dem Login kopieren

你会以为上面的代码结果是“3”吗?但是实际上它会抛出错误b is not a function,因为根据 ASI 规则,它会被解析成如下代码:

const a = 1;const b = 2;const c = a + b(a + b).toString()
Nach dem Login kopieren

我们就不一一介绍/, +, - 作为语句开头的情况了,这种情况比较少,大家可以自己试试。只需要记住语句以([/+-开头时,语句前需要加上分号即可!

下面再在看看使用return的情况,

(() => {
  return
  {
    name: &#39;Liu Xing&#39;
  }
})()
Nach dem Login kopieren

你的期待值是不是返回一个带有 name 的对象,但是它却返回了undefined。这是 ASI 自动在return给加上了分号。在这儿就得正确的换行以确保代码正确运行。我们可以看出除了正确的的分号,我们还需要正确合理的换行来使代码结构更为清晰。

总结

我们了解了 JavaScript 的分号自动插入机制,知道了 JavaScript 什么时候会自动加入分号,在([、 /+-

Sehen wir uns einen weiteren Beispielcode einer Anweisung an, die mit ( beginnt.

rrreeeGlauben Sie, dass das Ergebnis des obigen Codes „3“ ist? Tatsächlich wird jedoch der Fehler b ausgegeben ist keine Funktion, da sie gemäß den ASI-Regeln in den folgenden Code geparst wird: rrreeeWir werden /, +, - wird einzeln als Anfang einer Anweisung verwendet. Sie können es selbst versuchen. Sie müssen sich nur daran erinnern, dass die Anweisung mit () beginnt , [, . Wenn Sie mit /, +, - beginnen, müssen Sie vor der Anweisung ein Semikolon hinzufügen

Schauen wir uns die Verwendung von return an, 🎜rrreee 🎜Ihr erwarteter Wert besteht darin, ein Objekt mit name zurückzugeben, aber es gibt undefiniert zurück von ASI in return Hier sind korrekte Zeilenumbrüche erforderlich, um sicherzustellen, dass der Code korrekt ausgeführt wird Machen Sie die Codestruktur klarer Sie haben den Mechanismus zum automatischen Einfügen von Semikolons in JavaScript kennengelernt. Erfahren Sie, wann JavaScript automatisch Semikolons in (, [, /, +, <code>-Wir müssen am Anfang ein Semikolon hinzufügen. Der Mechanismus zum automatischen Einfügen von Semikolons hängt von Ihren Vorlieben oder den Vorlieben Ihres Teams ab B. Prettier und Eslint, können Stile automatisch vereinheitlichen

Das obige ist der detaillierte Inhalt vonSollte JavaScript ein Semikolon hinzufügen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage