3

セミコロンを忘れると C++ などの言語は機能しませんが、JavaScript などの他の言語では自動的に含まれます。

私はこの記事から知っています JavaScript のすべてのステートメントの後にセミコロンを使用することをお勧めしますか? 、セミコロンを使用することが推奨されており、不要なあいまいさを作成する可能性のあるシナリオがあります (ブレースが使用されていない場合に C++ で他にぶら下がっているなど)。

ある時点で、それらをオプションにする決定があったに違いありません (たとえば、JavaScript の作成者がそれをオプションにするという意識的な選択をしたとき)。

この決定が下された理由と、これらの言語のユーザーにとってどのように役立つかを知りたい.

背景: 私は初心者のコーダーで、最近 JavaScript の学習を始めたばかりです。

編集:JavaScriptでは悪いと言っているコメントに、私は知っています。ほとんどの人がそれを悪い習慣だと考えるのであれば、そもそもなぜそれが許されているのかと私は尋ねています。

4

4 に答える 4

4

JavaScript については、Douglas Crockford がこのビデオでアイデアの起源を説明しています。(これは素晴らしい講演であり、JavaScript を追求し続けるつもりなら、時間を取って視聴する価値があります。)

これはトークからの直接の引用です:

セミコロンの挿入は、C 構文を初心者にとってより簡単にするためのものでした。

言語のユーザーにとってどのように有益であるかについて、Crockford は、なぜ有益ではないのか、むしろ構文に非常に深刻なあいまいさと落とし穴がどのように導入されるかについて、いくつかの理由を詳細に説明しています。最も注目すべきケースの 1 つは、左中括弧のコーディング スタイルを使用してオブジェクト リテラルを返そうとする場合です (ビデオのソース)。

return
{
    ok: false
};

セミコロンの挿入により の後returnに 1 が追加され、残りの目的のオブジェクト リテラルがコード ブロックとして解析されるため、これは実際には undefined を返します。

return;
{
    ok: false;
}

言語を初心者にとってより簡単にしようとすることは、善意による大失敗の大きな原因となる可能性があります。

于 2014-12-11T00:42:13.207 に答える
2

JavaScript 言語の作成者である Brendan Eich は、自動セミコロン挿入 (ASI) のトピックに関するThe infernal semicolonと呼ばれるこのテーマに関するブログ投稿を行っています。

関連する引用:

ASI は (正式には) 構文エラー修正手順です。


1995 年 5 月のあの 10 日間に、JS で改行をもっと重要なものにしておけばよかったのにと思います。そうすれば、ASI の代わりに、継続行の末尾に中置演算子を使用する必要があることを呪うことになるでしょう。継続を次の行に強制します。しかし、その船はほぼ 17 年前に出航しました。


私の2セント:JSに重要な改行を与えたかのようにASIを使用しないように注意してください。

于 2014-12-11T00:47:29.420 に答える
1

JavaScript では、セミコロンはステートメントの区切り記号ですが、改行もそうであるため、行ごとにステートメントがある場合はセミコロンは必要ありません。

C++ などの他の言語には ; しかありません。セパレータとして、および改行のような空白は何もしません。長所と短所があります

C++ では、構文が一貫していることを意味します

あなたが書くなら

int x=0;
x++;

次に、1行に圧縮すると、同じ一般的な構文になります:-

int x = 0;  x++;

JavaScriptで書く場合

var x=0
x++

次に、1行に圧縮した場合

var x=0 x++

問題になる

あなたがする必要があるだろうvar x=0; x++

したがって、大きな問題は、空白が重要かどうかです。理想的には、言語は一貫して 1 つのメカニズムを使用します。しかし、javascript の場合は混合されているため、いつ使用するかが少しあいまいになります。

于 2014-12-11T01:00:41.983 に答える
1

むかしむかし、埃まみれの遠い昔、このようなことは主に、コンパイル/リンク/実行サイクルが最低でも数時間単位で測定され、多くの場合 1 日以上実行されたという事実を補うために行われました。結果が出るまで何時間も待つのは非常にイライラするかもしれませんが、愚かなタイプミスのためにコンパイラーが 3 行目 (またはその他) で停止していることに気付くだけです。

これに対抗するために、当時の一部のコンパイラは、意図した意味を推測しようとしました。そのため、タイプミスが十分に軽微である場合 (「十分に軽微」の定義について)、実際に意図したことを知っていると想定し、コンパイルを続行します。エラーにもかかわらず (実行する可能性さえあります)。

歴史を学ばない者は、歴史を繰り返す運命にある。傲慢すぎて歴史から学べない少数の人々も同じことを繰り返しています。現時点で、言語設計者がこの間違いを犯す原因となる正確な種類の文字欠陥については、おそらくかなりの議論の余地があります。しかし、それが間違いであるかどうかについて議論する余地ははるかに少ない (実際にはまったくありません)。

于 2014-12-11T00:45:42.757 に答える