17

Javascript の短縮形パターンを調べて時間をつぶしていたときに、ここifでステートメントを表現する興味深い方法に出会いました。以下の作品:

​var var1 = 5;
var var2 = 1;

var1 == 5 && var2++;

ifこれは、 1 つの操作のみを実行する必要があるステートメントを作成する、非常にクールな (そして短くてクリーンな) 方法だと思います。ただし、次のコードで何か他のことを試すとすぐに、次のコードで問題が発生しました。

​var var1 = 5;
var var2 = 1;

var1 == 5 && var2 = 2;

最初のコード スニペットのように動作する代わりに、私のテストはエラーをスローします。

Uncaught ReferenceError: 割り当ての左辺が無効です

これが機能しないのはなぜですか? また、私のステートメントの右側ではなく左側が間違っていると指摘されているのはなぜですか?

4

3 に答える 3

33

operator はoperatorよりも優先順位が高いため&&=これは機能しません。つまり、コードは次のように解釈されます。

(var1 == 5 && var2) = 2; 

割り当てを手動で括弧で囲むと、正しく解釈されます。

var1 == 5 && (var2 = 2); 

他の人は、このようなコードを書くと、コードの意図を読みにくくするので悪い考えだと叱責しますが、特にこのイディオムに慣れていない人にとってはそうですが、試してみることが重要です。このようなことを試してみて、何が起こるかを自分で確認してください。このアプローチに関しては、すでに厄介なことの 1 つに遭遇しています。

とにかく、このような場合、私は個人的にこのような単一行のifステートメントを使用することを好みます

if(condition) statement;

より多くのステートメントが必要なときに手動で括弧を追加する必要があるため、他の人はそれが悪いスタイルだと言うと確信していますが、これは本当に私を悩ませていません.IMOは、あなたが言ったように、単純な条件のために3行を使用するよりもきれいです. .

于 2012-04-25T02:15:05.910 に答える
16

これが期待どおりに機能しないことを心配しないでください。実際、1 か月も経たないうちに、Brendan Eich (JavaScript の作成者) が、この種の使用は JavaScript の「乱用」として知られていることを私たちと共有していましたこの論理演算子は、このようなコードを実行することを意図したものではなく、式の値を決定することを意図しているためです。

「私も同意します... && 行は悪用であり、Java を介した JS の C 遺産のために許可されていますが、ほとんどの JS ハッカーには眉をひそめています。また、if ステートメントの方がはるかに優れたスタイルである...」http: //brendaneich.com/2012/04/the-infernal-semicolon/

そうは言っても、ステートメントをラップすることで、演算子の優先順位の問題を回避できます。

(var1 == 5) && (var2 = 2)
于 2012-04-25T02:19:52.007 に答える
1

右側で無効な演算子を使用しているためです。ステートメント全体を単一の変数として読み取ろうとしています。

于 2012-04-25T02:16:14.230 に答える