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)

目次1. フロントエンドの状態管理とは何ですか? 2. ヴュークス3. バス4. ウェブストレージ序...

docker cp ファイルをコピーしてコンテナに入る

実行中のコンテナに入る # コンテナに入り、新しいターミナルを開きます# docker exec -...

dockerでマウントされたディレクトリが読み書きできない問題を解決する

次のコマンドを使用してコンテナを作成し、ローカルの /home/dock/Downloads ディレ...

Vue カードスタイルのクリックして切り替える画像コンポーネントの使用方法の詳細な説明

この記事では、vueカードスタイルのクリックして切り替える画像コンポーネントを参考までに紹介します。...

Ubuntu 18.04.4 に MySQL をインストールするプロセスの詳細な説明

Ubuntu 18.04.4 に MySQL をインストールするプロセスを見てみましょう。内容は次の...

js の hasOwnProperty のプロパティとインスタンスの使用法の詳細な説明

1. js は hasOwnProperty が不正に占有されることから保護しません。オブジェクトに...

Pythonは出力をcsv操作に書き込む

以下のように表示されます。 def test_write(self): フィールド=[] field...

Linux の MySQL 設定の変更が有効にならない問題の解決方法

背景AWS EC2 を使用するプロジェクトサービスがあります。セキュリティとパフォーマンスを考慮して...

Vue+Openlayerはグラフィックスのドラッグと回転変形効果を実現します

目次序文関連資料成果を達成する実装手順序文Openlayer には独自の拡張プラグイン ol-ext...

見栄えの良い CSS カスタム スタイル (タイトル h1 h2 h3)

レンダリングBlog Gardenでよく使われるスタイル /*タイトル h1 h2 h3 スタイル*...

Bootstrap3.0 学習ノートテーブル関連

この記事では、Webサイトを作ったことがある人にとっては馴染みのあるテーブルについて主に説明します。...

ApacheとTomcatを組み合わせて静的状態と動的状態を分離する方法

実験環境ApacheとTomcatは両方ともIPアドレス192.168.153.136のホストにイン...

SQL 最適化チュートリアル: IN クエリと RANGE クエリ

序文「High Performance MySQL」では、インデックスでは範囲フィールドの後の部分が...

JavaScriptは文字の出現回数をカウントします

この記事の例では、文字の出現回数をカウントするJavaScriptの具体的なコードを参考までに共有し...

ユニークインデックスの S ロックと X ロックによる MySQL デッドロック ルーチンの理解

「初心者向けソースコードからの MySQL デッドロック問題の理解」では、MySQL ソースコードを...