web-dev-qa-db-ja.com

Pythonの改行の処理は、JavaScriptの自動セミコロンとどう違うのですか?

Javascriptには自動セミコロン挿入と呼ばれる機能があり、基本的にパーサーが無効なトークンを検出し、その前の最後のトークンが改行だった場合、パーサーは改行がある場所にセミコロンを挿入します。これにより、基本的にすべてのJavaScriptコードをセミコロンなしで記述できますが、主にreturnキーワードがあり、次に改行で返す値がある場合は、いくつかのEdgeのケースに注意する必要があります。

function test(){
    // This will return 'undefined', because return is a valid statement
    // and  "john" is a valid statement on its own.
    return 
          "john"
}

これらの落とし穴があるため、「セミコロンの自動挿入は悪である」、「Javascriptでは常にセミコロンを使用する」などのタイトルが付いた記事が多数あります。

しかし、Pythonでは、セミコロンを使用する人はいません。まったく同じです。

def test():
    # This will return 'undefined', because return is a valid statement
    # and  "john" is a valid statement on its own.
    return 
    "john"

まったく同じように動作しますが、Pythonの動作を完全に恐れる人はいません。

私は、javascriptがうまく動作しないケースは、あなたがそれらを簡単に回避できるはずであるほど十分に少ないと思います。新しい行に+値を返しますか?人々は本当にそれをたくさんしますか?

意見はありますか? JavaScriptでセミコロンを使用していますか?その理由は?

41
Einar Egilsson

その理由は、Pythonでは改行がコード行を区切る明確な方法だからです。これは仕様によるものであり、これがどのように機能するかは徹底的に検討されています。その結果、pythonコードは完全に読み取り可能で、特別なステートメント終了マーカー(改行を除く)がなくても明確です。

一方、JavaScriptはCのような構文を考慮して設計されており、ステートメントは常にセミコロンで終了します。言語をエラーに対してより寛容にするために、コードを正しくするために余分なセミコロンをどこに置くべきかを推測しようとします。これはCのような構文に改造されているため、期待どおりに機能しない場合があり(スクリプトインタープリターが誤って推測する場合があります)、かなり直感に反するコードになる可能性があります。\

または、「明示的である方が暗黙的であるよりも優れている」と主張する:Pythonでは、改行はすでに完全に明示的ですが、JavaScriptではあいまいであるため、セミコロンを追加して明示的にします。

62
tdammers

Pythonでの動作方法とはかなり根本的な違いがあると思います。リンク先のEinar Egilssonからの引用:「後続の行の最初のトークンを同じステートメントの一部として解析できる場合、セミコロンは行の終わりに含まれません」。

Pythonでは、括弧で囲まれた式の中など、かなり明白な場合を除いて、改行は常にステートメントを終了します。一方、JavaScriptは、以前に可能な限り多くの行を解析しようとしますステートメントを終了すると、次のような結果になる可能性があります。

// Define a function and name it area.
area = function(r) {
    return r * r * 3.14159
}

// Fooled you! We're actually invoking it.
(14)
28
Henrik

プロダクションモードでJSファイルを最小化することがよくあります。つまり、コメントと改行を削除します。

セミコロンを使用しないと、Javascriptが壊れます。

20
Deradon

あなたが説明するようにそれは機能しません。

Javascriptには自動セミコロン挿入と呼ばれる機能があり、基本的にパーサーが無効なトークンを検出し、その前の最後のトークンが改行だった場合、パーサーは改行がある場所にセミコロンを挿入します。

これは間違っています。例:

return
  1 + 2;

1は完全に有効なトークンですが、パーサーはreturnの直後にセミコロンを挿入します。

ご覧のとおり、セミコロンがどこで発生するかを正確に知ることはできません。

自動挿入の問題は2つあります。

  • 1つは、自動挿入では挿入する必要があると判断できないセミコロンを省略してしまう場合があるためです。
  • また、上記のように、意図しない場所にセミコロンが挿入される場合があります。

もちろん、すべてのステートメントの後にセミコロンを使用すると、最初のエラーの原因のみに役立ちます。

いずれにせよ、今ではご想像のとおり、Cのような構文でセミコロンを自動挿入するのは悪い考えだと思います。

5
Svante

簡単な理由を1つ述べます。

Javascriptは「ちょっとJava風」または「ちょっとC風」に見えます。もちろん動的な言語なので、見た目は異なりますが... 中かっこはあります。中かっこ付きの言語には通常セミコロンがあります自然な反射神経が動き始め、先にセミコロンキーに向かって指を動かしますあなたがた Enter

反対に、Pythonは一見してもまったく異なるように見えます。したがって、「標準的な退屈な言語」との類似はほとんどまたはまったく直感的に形成されず、「Pythonモード」に入ると、セミコロンは自然に来ます。

4
Kos

JavaScriptでセミコロン挿入を使用するには、いくつかの良いnotの理由があります。

これは主に、ECMAScript標準で定義されているセミコロンの挿入が直感的でない場合があるためです。 @Svanteは、改行の使用が問題を引き起こすreturnのケースを指摘しています。

singセミコロンを使用している場合にも問題が発生することは、彼が言及していないことです。セミコロンの挿入は、必要かどうかに関係なく発生するためです。

セミコロン挿入を使用しない別の非常に良い理由がないは、出力制御です。多くの場合、JavaScriptは本番環境で使用される前に縮小機能を介して実行されます。一部の縮小機能はセミコロンの自動挿入のケースを処理しますが、完全に機能するためにrelyする理由はありません。

さらに、コンテンツ管理システムでは、インラインJavaScriptが自動縮小される場合があり、自動縮小が単にコメントを削除し、各行の最初と最後から空白(改行を含む)を削除する場合が多くあります。

どのツールを選択するかを選択できない著者にとっては、ほとんどの場合に機能するフォーマットをそのまま使用する方がはるかに簡単です。

2
zzzzBov

セミコロンを使用しないことは、ファイルのJavaScriptファイルを縮小する際の失敗の秘訣です。だから怖いです。

1
Eastern Monk

Javascriptでは、セミコロンの自動挿入がなくても構文的に正しいプログラムを記述できます。ASIはそのプログラムをdifferent構文的に正しいプログラムに変換します(たとえば、値を返すコードの変換)何も返さないコードに)。 Pythonには類似のケースはありません。 Pythonすべての改行canステートメントを終了するwillステートメントをバックスラッシュでエスケープしない限り、終了します。技術的には、 JavaScriptのルールも同様に確定的ですが、ステートメントを終了するためのJavaScriptのルールを1つの文で要約できるかどうかはわかりません。

1

ほとんどの場合、JavaScriptのASIは期待どおりに処理します。 ASIの1つの例は、おそらく期待どおりに動作しない可能性があります。

var i = 0

(function() {
   // do something
})()

これは、匿名関数を使用して関数0を呼び出し、結果を実行すると解釈されます。この場合、おそらく割り当てを行い、すぐに無名関数を実行したいと考えていました。

ASIに詳しくない人にとっては、このような問題が発生すると非常に混乱する可能性があるため、チームの開発者には常にセミコロンを使用することをお勧めします。

(余談ですが、個人/サイドプロジェクトで作業するときは、セミコロンを使用しません。コードを保守する必要のある人が他にいないためです。)

1
jay_soo

あなたのように、それは少し偏執狂的だと思います。セミコロン挿入のルールは、PythonおよびCoffeeScriptの場合と同様に、JavaScriptで適切に定義されています。リッターPythonまたはセミコロンを含むCoffeeScriptはありません。 JavaScriptの扱いが異なりますか?

それは、約10年前の典型的なJavaScriptコードの惨めな状態に対する過剰反応だと思います。JavaScriptは、弱く、バグが多く、醜く、良くない言語と見なされていました。恥ずかしかったです。あなたはおそらくJavaScriptで良いコードを書くことができませんでした!

次に、人々がやって来て、あなたがJavaScriptで美しく明確なコードを書くことができたことを証明しようとしました。 「alwaysuse semicolons」ルールはこの波の一部でした。そして正直に言うと、いくつかの状況を少し明確にすることができます。

JavaScriptがまだ異なる扱いを受けるのはなぜですか?

慣性があります。そして、それは見過ごされるべきではありません明示的に構造化されたコードを高く評価する人々は、Cスタイルの言語を好むことが多いです。暗黙的に構造化されたコードを高く評価する人々は、しばしば非- Cスタイル言語(CoffeeScriptなど)。

1
Closure Cowboy

私は一貫性を保つためにJavaScriptで厳密に使用しています。ほとんどの行が持っている場合

Pythonは、単一行の複数のステートメントなどのEdgeケース用にそれらを備えています。javascriptはそれらを備えており、定期的に使用されていることがわかるので、私はそれらが使用される基準に準拠しています。

同じ行にある複数のステートメントの使用法が見つからないため、セミコロンの使用を予測していません。

0
Chris

Railsのbundle-fuやWebアプリケーションのアセットマネージャーなどを使用している場合、JavaScriptのトークンの最後にセミコロンがなければ、ひどく壊れてしまいます。そのため、1つ配置することをお勧めします。

0
subiet

IEの正確なバージョンを思い出せませんが、セミコロンがない場合、IEが文字通りエラーになる場合があります。IIRCは、次のようなグローバルスコープにいる場合です。

var myFunc = function() {
  ...
}

追加しない場合、右中括弧の後、プログラムは一部のバージョンのIEで実際に失敗します。そのため、他の理由(常に明示的に使用するというCrockfordの推奨事項を含む)が原因で、どの場合でも常に明示的に使用するようになりました。

0
apinstein