ホームページ ウェブフロントエンド jsチュートリアル Javascript セミコロン ルールの知識の紹介 (例付き)

Javascript セミコロン ルールの知識の紹介 (例付き)

Mar 25, 2019 pm 02:21 PM
javascript 文法

この記事では、Javascript のセミコロン ルールに関する知識を (例とともに) 紹介します。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。

時間をかけて、JS のセミコロンのルールを理解してください~~~最後にセミコロンがあるモードが好きか、セミコロンを省略したほうが好きか

セミコロンが許可されるシナリオ

セミコロンは通常、do-while ステートメント、var ステートメント、expression ステートメント、 continue、return、break ステートメント、throw、debugger など、ほとんどのステートメントの最後に使用できます。

Chestnut:

do Statement while ( Expression ) ;

4+4;

f();

debugger;
ログイン後にコピー

にはセミコロンが 1 つだけあり、空のステートメントを表すことができます。これは JS では有効であり、;;;; は 3 つの空のステートメント (空のステートメント)

# に解析できます。 ##空のステートメント これは、次のような文法的に正しい解析結果の生成を支援するために使用できます。

while(1);
ログイン後にコピー
末尾にセミコロンがない場合、解析エラーが発生します。条件付きループの後には、ステートメント

セミコロンは引き続き表示されます for ループに表示されます for (式; 式; 式) ステートメント

最後に、セミコロンは文字列または正規表現にも表示されます - セミコロン自体を示します

セミコロンは省略できるシナリオ

一部のシナリオでは、セミコロンを省略できます。パーサーは、ステートメントの解析時に必要に応じてセミコロンを自動的に挿入します。おおよそのプロセスは次のように理解できます。

記述省略=> パーサー 解析中に欠落が見つかった場合、正しく解析されません => 自動的にセミコロンを追加します

そのため、セミコロンが使用できるシナリオを明確にする必要があります。セミコロンは自動的に挿入されず、解析エラーが発生することを明確にします

ルール 1: 次のトークン (問題のあるトークン) と現在解析されているトークン (前のトークン) が正当なトークンを形成できない場合ステートメントを実行し、次の条件が 1 つ以上満たされる場合、問題のあるトークンの前にセミコロンが挿入されます。

    問題のあるトークンと前のトークンは、少なくとも 1 つの改行文字 (LineTerminator) で区切られています。セミコロンの挿入の効果は空のステートメント (空のステートメント)
  • 問題のあるトークンは}
  • 前のトークン) として解析されず、挿入されたセミコロンは終了セミコロンとして解析されます。 do-while ステートメントの
#考慮すべき優先順位の高い条件もあります。挿入された場合、セミコロンは空のステートメント、または for ステートメントの先頭にある 2 つのセミコロンのいずれかとして解析されます。 、セミコロンは挿入されません (do-while ステートメントの終了セミコロンを除く)

ルール 2: 解析がソース コード ファイル (入力ストリーム) の終わりに達すると、セミコロンが自動的に挿入されます。解析の終了をマークするために追加されました

ルール 3: 制限された生成構文に準拠するステートメント - 翻訳が難しく、理解できない この状況の主な説明は次のとおりです。改行文字が表示されるべきでない場所に改行文字が挿入されると、セミコロンが挿入され、元のステートメントの意味が変わります。

次の条件が同時に満たされる場合、問題のあるステートメントの前にセミコロンが自動的に挿入されます。トークン セミコロン:

    問題のあるトークンと前のトークンが、構文制限された生成ステートメントを形成します。
  • 問題のあるトークンは、制限された生成ステートメントの説明の [ここに LineTerminaator はありません] 部分に表示されます (トークン制限されたプロダクション内の注釈「[no LineTerminator here]」の直後にある端末または非端末の最初のトークンになります。)
  • 問題のあるトークンと前のトークンの間には、少なくとも 1 つの改行文字 (LineTerminator) が必要です
制限されたプロダクションには次のもののみが含まれます:

UpdateExpression[Yield, Await]:
  LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++
  LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] --

ContinueStatement[Yield, Await]:
  continue;
  continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await];

BreakStatement[Yield, Await]:
  break;
  break  [no LineTerminator here]  LabelIdentifier[?Yield, ?Await];

ReturnStatement[Yield, Await]:
  return;
  return  [no LineTerminator here]  Expression  [+In, ?Yield, ?Await];

ThrowStatement[Yield, Await]:
  throw [no LineTerminator here] Expression [+In, ?Yield, ?Await];

ArrowFunction[In, Yield, Await]:
  ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In]

YieldExpression[In, Await]:
  yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await]
  yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await]
ログイン後にコピー
簡単な概要:

a ステートメントを使用する場合、変数と変数は同じ行になければなりません。それ以外の場合は、異なるセマンティクスの前にセミコロンが挿入されます。

return throw yield continue Break の後に改行が続く場合、セミコロンが自動的に追加されます

矢印の => の前に改行文字があってはなりませんfunction

Chestnut & は期待される状況を満たさない可能性があります

期待される状況に準拠します

// 相当于 42;"hello"
42
"hello"

// offending token 是 }
if(x){y()}

// previous token 是 ) 且插入分号是 do while 语句的结束
var a = 1
do {a++} while(a<100)
console.log(a)

//  不会解析成 b++ 因为 b和++之间存在换行符,会在 b 之后自动插入分号
a = b
++c
ログイン後にコピー

期待される状況を満たさない可能性があります

const hey = &#39;hey&#39;
const you = &#39;hey&#39;
const heyYou = hey + &#39; &#39; + you

[&#39;h&#39;, &#39;e&#39;, &#39;y&#39;].forEach((letter) => console.log(letter))
ログイン後にコピー
エラー Uncaught TypeError: unknown のプロパティ 'forEach' を読み取れません。あなたと ['h', 'e', 'y'] の間の接続は正当な構文にヒットする可能性があるため、それらの間にセミコロンは自動的に挿入されません- 期待と矛盾して、JS は次のようにコードを解析しようとします:

const hey = 'hey';
const you = 'hey';
const heyYou = hey + ' ' + you['h', 'e', 'y'].forEach((letter) => console.log(letter))
ログイン後にコピー
別の状況を見てください:

const a = 1
const b = 2
const c = a + b
(a + b).toString()
ログイン後にコピー

TypeError: b は関数 エラーを引き起こします。これは次のように解釈されます:

const a = 1
const b = 2
const c = a + b(a + b).toString()
ログイン後にコピー
Except do while ステートメントを除き、セミコロンが空のステートメントとして、または for ステートメントの先頭に必要な 2 つのセミコロンとして挿入される状況はありません。

if (a > b)
else c = d

for (a; b
)
ログイン後にコピー
上記のいずれも正当な JS ステートメントではないため、エラーが発生します。

したがって、次の栗のセミコロンはすべて省略できません。 !

// for循环没有循环体的情况,每一个分号都不能省略
for (node=getNode();
     node.parent;
     node=node.parent) ;
ログイン後にコピー
詳細なコメント付きの別の例を見てください:

var         // 这一行不会插入分号 ,因为 下一行的代码不会破坏当前行的代码  
    a = 1   // 这一行会插入分号   
let b = 2   

// 再比如这种情况,你的原意可能是定义 `a` 变量,再执行 `(a + 3).toString()`,
// 但是其实 JavaScript 解析器解析成了,`var a = 2(a + 3).toString()`,
// 这时会抛出错误 Uncaught TypeError: 2 is not a function
var a = 2
(a + 3).toString()

// 同理,下面的代码会被解释为 `a = b(function(){...})()`
a = b
(function(){
...
})()
ログイン後にコピー
上記はすべて、ルール 1 がヒットせず、セミコロンが挿入されないため、解析が期待と一致しない場合です

ルール 3 に基づいた例を見てください。

(() => {
  return
  {
    color: 'white'
  }
})()
ログイン後にコピー
は color 属性を含むオブジェクトを返すと想定されていますが、実際には return の後にセミコロンが挿入され、最終的には unfineed が返されます。 return 中括弧 {:

(() => {
  return {
    color: 'white'
  }
})()
ログイン後にコピー
セミコロン省略のベスト プラクティス

の直後に配置できます。

不要使用以下单个字符 ( [ / + - 开始一行 , 会极有可能和上一行语句合在一起被解析( ++ 和 -- 不符合单个 +、- 字符)

注意 return break throw continue 语句,如果需要跟随参数或表达式,把它添加到和这些语句同一行,针对 return 返回内容较多的情况 (大对象,柯里化调用,多行字符串等),可以参考规则1,避免命中该规则而引起非预期的分号插入,比如:

return obj.method('abc')
          .method('xyz')
          .method('pqr')
 
return "a long string\n"
     + "continued across\n"
     + "several lines"
 
totalArea = rect_a.height * rect_a.width
          + rect_b.height * rect_b.width
          + circ.radius * circ.radius * Math.PI
ログイン後にコピー
后缀运算符 ++ -- 需要和操作变量在同一行使用

当然大部分工程化情况下,我们最终会配合Eslint使用带分号或省略分号规范~~~

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript视频教程栏目!

以上がJavascript セミコロン ルールの知識の紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

ラムダ式の構文と構造の特徴は何ですか? ラムダ式の構文と構造の特徴は何ですか? Apr 25, 2024 pm 01:12 PM

ラムダ式は名前のない匿名関数であり、その構文は (parameter_list)->expression です。匿名性、多様性、カリー化、閉鎖性が特徴です。実際のアプリケーションでは、ラムダ式を使用して、合計関数 sum_lambda=lambdax,y:x+y などの関数を簡潔に定義し、map() 関数をリストに適用して合計演算を実行できます。

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

WebSocket と JavaScript を使用してオンライン共同エディターを実装する方法 WebSocket と JavaScript を使用してオンライン共同エディターを実装する方法 Dec 17, 2023 pm 01:37 PM

リアルタイムの共同エディターは、特にさまざまなチーム コラボレーション、オンライン ドキュメント編集、タスク管理シナリオにおいて、現代の Web 開発の標準機能となっています。WebSocket に基づくリアルタイム通信テクノロジは、チーム メンバー間の通信効率とコラボレーション効果を向上させることができます。この記事では、WebSocket と JavaScript を使用してシンプルなオンライン共同エディターを構築する方法を紹介し、読者が WebSocket の原理と使用法をよりよく理解できるようにします。 WebSocketWebSo の基本原理を理解する

See all articles