JavaScript におけるセミコロンの詳細

JavaScript におけるセミコロンの詳細

序文

JavaScript ではセミコロンはオプションであり、使用するかどうかは主にコーディング スタイルの問題です。 1 つのスタイルは、必要でない場合でもセミコロンを使用してステートメントを明示的に終了することです。もう 1 つのスタイルは、セミコロンをできるだけ使用せず、必要な場合にのみ追加することです。個人的にはセミコロンをつけるのは好きではないのですが、もちろんそれを好む友人もたくさんいます。どちらのスタイルを好むかにかかわらず、JavaScript のセミコロンについて知っておく必要のある詳細がいくつかあります。

コードにおけるセミコロンの役割

セミコロンの主な機能は、プログラム ステートメントを終了するステートメント アサーション (EOS) として、パーサーがプログラムを正しく解析できるようにすることです。多くの C スタイル言語では、主に言語コンパイラの開発コストを削減するために、セミコロンを使用してステートメント行を明示的に終了します。しかし、最近のコンパイラは複数行のステートメントを適切に処理できるほどスマートです。 Go、Scala、Ruby、Python、Swift、Groovy など、多くの言語では明示的なセミコロンの終了は必要ありません。

JavaScript は C に似た言語ですが、C や Java とは異なります。JavaScript ではセミコロンもオプションであり、Auto Semicolon Insertion (ASI) と呼ばれる自動セミコロン挿入メカニズムがあります。

JavaScript の自動セミコロン挿入メカニズム

JavaScript には、自動セミコロン挿入 (略して ASI) と呼ばれるメカニズムがあります。 ECMA-262 - 自動セミコロン挿入には、自動セミコロン挿入に関する明確な記述があります。

プログラムを左から右に解析します。文法生成規則に準拠しないトークン (問題のあるトークン) が検出されると、次のいずれかの条件が満たされている限り、問題のあるトークンの前にセミコロンが自動的に挿入されます。

  • 少なくとも 1 つの行末文字が、問題のあるトークンを前のトークンから分離します。
  • 問題のあるトークンは } です。

プログラムを左から右に解析すると、トークンの入力ストリームが終了し、パーサーが入力トークン ストリームを単一の完全な ECMAScript プログラムに解析できない場合は、入力ストリームの最後にセミコロンが自動的に挿入されます。

プログラムを左から右に解析します。一部の文法生成規則で許可されているが制限された操作 (制限された生成) であるトークンに遭遇した場合、制限されたトークンと前のトークンの間に少なくとも 1 つの改行文字がある場合は、制限されたトークンの前にセミコロンが自動的に挿入されます。

ただし、上記のルールには追加の優先条件があります。セミコロンを挿入した後の解析結果が空のステートメントである場合、またはセミコロンを挿入した後で for ステートメントの先頭の 2 つのセミコロンのいずれかになった場合は、セミコロンは自動的に挿入されません。

注: 上記の翻訳は少しぎこちないです。何度か読み返したり、元の英語テキスト ECMA-262 - Automatic Semicolon Insertion を読んでみてください。

セミコロンの自動挿入

簡単にまとめると、自動セミコロン挿入は改行に基づいています。パーサーは新しい行を現在の行にマージしようとします。新しい行は、ASI ルールに準拠している場合にのみ、独立したステートメントとして扱われます。

主な自動挿入ルールは次のとおりです。

  1. 新しい行が現在の行に結合されると、不正なステートメントとなり、正しく解析できなくなります。セミコロンが自動的に挿入されます。
  2. 新しい行が } で始まる場合、コード ブロックの末尾にセミコロンが自動的に挿入されます。
  3. return文で終わる場合、行末にセミコロンが自動的に挿入されます。
  4. break文で終了する場合、行末にセミコロンが自動的に挿入されます。
  5. throw文で終わる場合、行末にセミコロンが自動的に挿入されます。
  6. continue文で終了する場合、行末にセミコロンが自動的に挿入されます。
  7. ES6のyield文で終わるときに行末にセミコロンを自動的に挿入する
  8. ++, -- 接尾辞式は新しい行の始まりとして使用され、行の先頭にセミコロンが自動的に挿入されます。
  9. ソースコードファイルの末尾に数字を自動的に挿入する

上記のように、セミコロンを追加しないと、このコードを実行するとエラーが発生します。

セミコロンは省略できません

通常、文が (、[、/、+、- で始まる場合、前の行の文の一部として解釈される可能性があります。実際には、/、+、- で始まる文はほとんどありません。ただし、(、[ で始まる文は非常に一般的であり、通常は防御的に行の先頭にセミコロンを追加できます。

先ほど、セミコロンの自動挿入について学習しました。ここで、いくつかの例を見てみましょう。

hey = 'hey'とする
['liu','liuxing'].forEach(console.log)

ちょっと考えてみてください。上記の結果は何でしょうか?このコードを実行すると

キャッチされない TypeError: 未定義のプロパティ 'forEach' を読み取ることができません

ルール1に基づいて、上記のコードは次のコードに解析されます。

hey = 'hey'['liu','liuxing'].forEach(console.log) とします。

先頭にセミコロンを付けずに [ で始まるステートメントを使用すると、エラーが発生する可能性が高いことがわかります。

(で始まる文の別のサンプルコードを見てみましょう。

定数a = 1
定数b = 2
定数 c = a + b
(a + b).toString()

上記のコードは値「3」を生成すると予想されますか?しかし、実際には、ASI ルールに従って次のコードに解析されるため、b は関数ではないというエラーが発生します。

定数 a = 1;定数 b = 2;定数 c = a + b(a + b).toString()

/、+、- が文頭に使われるケースを一つ一つ紹介することはしません。このような状況は比較的まれなので、自分で試してみることができます。文が (、[/+、または - で始まる場合は、文の前にセミコロンを追加する必要があることに注意してください。

次に、return の使い方を見てみましょう。

(() => {
  戻る
  {
    名前: '劉星'
  }
})()

名前付きのオブジェクトを返すことを期待していますが、undefined が返されます。これは、ASI がリターンにセミコロンを自動的に追加するためです。ここで、コードが正しく実行されるように、行を正しく折り返す必要があります。コード構造を明確にするには、正しいセミコロンに加えて、正しく適切な改行も必要であることがわかります。

要約する

JavaScript の自動セミコロン挿入メカニズムについて学習し、JavaScript がいつセミコロンを自動的に追加するかを知りました。(、[、/、+、- の先頭にセミコロンを正確に追加する必要があります。自動セミコロン挿入メカニズムには、セミコロンを追加するか追加しないかの 2 つのオプションがあります。これは、完全にあなたまたはチームの好みによります。現在では、prettier や Eslint などのスタイルを自動的に統一するツールもあります。

JavaScript のセミコロンに関するこの記事はこれで終わりです。JavaScript のセミコロンに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 複数の電子メールの完全な例の JS 正規表現検証 [電子メールはセミコロンで区切られます]
  • JavaScript におけるセミコロンの使用に関する簡単な説明
  • JavaScript 構文:自動セミコロン挿入
  • JavaScript ステートメントの後のセミコロンについて
  • JSセミコロンによるデバッグの問題
  • js でのセミコロンのクラッシュの例
  • JavaScript セミコロンの概要と詳細紹介
  • Javascript の自動セミコロン挿入 (ASI) メカニズムの簡単な分析
  • JavaScript が自動的にセミコロンを挿入するのを防ぐ方法
  • JavaScript におけるセミコロン挿入メカニズムの詳細な紹介

<<:  Linux 構成 SSH パスワードフリーログイン「ssh-keygen」の基本的な使い方

>>:  Mysql5.7 のグループ連結関数を使用するときにデータが切り捨てられる問題に対する完璧な解決策

推薦する

ウェブページの広告デザインにおけるウェブデザインの寸法とルール

1. 800*600 未満の場合、Web ページの幅が 778 以内であれば、水平スクロール バーは...

MySQL で null を置き換える IFNULL() および COALESCE() 関数の詳細な説明

MySQLではisnull()関数をnull値の代わりとして使用することはできません。次のように:ま...

mysql ステートメントを使用してユーザー権限を照会するプロセスの詳細な説明

MySQL では、ユーザーに付与された権限をどのように確認しますか? ユーザーに付与される権限は、グ...

Vue の this.$router と this.$route の違いと push() メソッド

公式文書には次のように記されている。ルーターを挿入することで、どのコンポーネントでも this.$r...

js でオブジェクトとオブジェクト メソッドを作成するいくつかの方法の詳細な説明

この記事は、JS レッドブックの第 8 章に記載されているオブジェクトに関する 2 番目の記事です。...

ウェブページ作成によく使われる英語フォント

アリアルArial は、多くの Microsoft アプリケーションとともに配布されるサンセリフ T...

MySql ファジークエリ JSON キーワード取得ソリューションの例

目次序文オプション1:オプション2:オプション3:オプション4(最終的に採用されたオプション):要約...

HTML フォーマットの json のサンプルコード

さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 <!DOCTYPE htm...

HiveメタデータをMySQLに設定するプロセス全体

Hiveのインストールディレクトリで、confディレクトリに入り、hive-site.xmlファイル...

ウェブページにプレーヤーを埋め込む埋め込み要素の自動開始が false 無効

最近、仕事でサウンド ファイルを再生するために Web ページにプレーヤーを埋め込む必要に迫られまし...

MySql はデータを正常に挿入しますが、[Err] 1055 エラーが報告されます。解決策

1. 質問:最近、挿入操作を行っています。MySQLのバージョンは5.7です。挿入は成功しますが、エ...

HTMLのフォントがline-heightを指定しても垂直方向に中央揃えできない問題の解決方法を詳しく説明します

による写真に示されている効果を例に挙げてみましょう。明らかに、「次へ」というテキストを水平方向だけで...

Docker nginxのインストールと設定方法

DockerでNginxイメージをダウンロードする docker プル nginx Docker イ...

Tomcat maxPostSize設定実装プロセス分析

1. maxPostSize を設定する理由は何ですか? tomcat コンテナには送信データのサイ...

Tencent Cloud Server Tomcat ポートにアクセスできない場合の解決策

最近、Tencent Cloudを使用してサーバーを設定しました。使用中に、tomcatポートにアク...