2013-05-18 19 views
18
a = 1; 
b = "1"; 
if (a == b && a = 1) { 
    console.log("a==b"); 
} 

上記Javascriptコードは、Google Chromeの26.0.1410.43でif文でエラーになります:なぜJavascript演算子 "&&"が変なのですか?

Uncaught ReferenceError: Invalid left-hand side in assignment

私はこれが文の第二部であるため、変数aだと思う&&a=1を割り当てることはできません。しかし、以下のコードを試してみると、私は完全に混乱しています!

a = 1; 
b = "1"; 
if (a = 1 && a == b) { 
    console.log("a==b"); 
} 

なぜ1つのステートメントは正しいのですが、他のステートメントは間違っていますか?

+3

とにかくここで何を達成しようとしていますか?コードは実際に何をすべきですか? –

+2

演算子の優先順位に常に '('と ')'を使用してください。 –

+1

ここで間違えました。このように 'if(a == 1 && a == b)'と書く必要があります。 –

答えて

21

第2のバージョンはa = (1 && a == b)と解析されます。つまり、式1 && a == bの結果はaに割り当てられます。

割り当ての左側が期待どおりに解析されないため、最初のバージョンは機能しません。式を解析して、の値を右辺のに割り当てようとしているかのように解析します。(a == b && a) = 1

これはすべて、さまざまな演算子の優先順位に基づいています。ここでの問題は、=が他の演算子より低い優先順位を持つという事実に起因します。

+2

両方の式が完全に正しく解析されます。彼らはOPが期待していた通りに解析されていません... – Alnitak

+0

@Alnitak:ええ、私はあなたの表現が良いと思います。 –

+1

オペレータの優先順位のリストについては、https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedenceを参照してください – MofX

6

操作の順序が期待どおりでないためです。 a == b && a = 1は、false = 1に相当する(a == b && a) = 1に相当します。

割り当てを本当にしたい場合は、その周りにかっこを使用する必要があります。a == b && (a = 1)。あなたはこのように式に代入することはできませんので、あなたの最初の割り当てが

if ((a == b && a) = 1) { 

に変わることを意味

2

最初に実行される操作は1 && a == bあります。 1 &&a == bの結果が実行されます。この&&の結果はaに割り当てられます。

+0

これは完全に正しいわけではありません。 ==は&&より高い優先順位を持ちます。これにより、次の評価順序が得られます。 1. 1 2. && - >左辺は既にtrueです。右辺を評価しないでください。 3。a = 1 結果はあなたが言ったのと同じです。しかし、1 && aは最初に評価されないので、a == bは決して評価されない1 &&(a == b)です。 1 B 2 C == D 3. B &&(C == D) 4:= Bのための一般的に && C == D評価順序は(bはfalsyであると仮定して)であろう。 a =(b &&(c == d)) – MofX

+0

申し訳ありません。私は間違いを訂正した。 – Deepu

+0

私のコメントも間違っています;)あなたは今すぐこのことを知っています。 && bを指定すると、aがtrueの場合のみbが評価されます。私の最後のコメントでは、私は偽でなければならないと言った。 – MofX

関連する問題