2013-09-03 8 views
11

中(トスと呼ばれる)岩紙はさみゲームのための私のコードは次のとおりです。にReferenceError:次のように無効左側割り当て

var toss = function (one,two) { 
    if(one = "rock" && two = "rock") { 
     console.log("Tie! Try again!"); 
    } 
    // more similar conditions with `else if` 
}; 

私は私が得るパラメータ

toss("rock","rock") 

に入力するとこのエラーコード:

"ReferenceError: Invalid left-hand side in assignment"

修正方法?このエラーが意味するものと、このエラーが発生する可能性のあるその他のケースは何ですか?

+0

3 "タイ" の場合は、単一の 'IF(1 == 2)' –

答えて

35

比較するには==を使用する必要があります(タイプを比較したい場合は===もあります)。単一の=が割り当て用です。

if (one == 'rock' && two == 'rock') { 
    console.log('Tie! Try again!'); 
} 
+3

私はアホだに簡略化することができる.... ....ありがとう!明確化のために – Kevin

+0

、==と===の違いは何ですか? – Kevin

+0

上記のコメントは間違っていますが、ECMAはこれが型チェックではないことを指定します。型強制と呼ばれる操作を行います。これは実際に知っておくと便利です。この回答を見るhttp://stackoverflow.com/questions/19915688/what-exactly-is-type-coercion-in-javascript – VladNeacsu

1
エラーの

一般的な理由:代わりに、引数(foo(42))を通過させる機能foo() = 42結果に割り当てる代わりに、等価の割り当て(=)の

  • 使用(==/===
  • 単純にメンバー名が欠落している(つまり、デフォルトの選択を前提としています)getFoo().theAnswer = 42または配列インデックスの代わりにgetFoo() = 42 (等価性をチェックするようif(one === "rock" && two === "rock")を、それはあなたがエラーを取得している実際の理由はトリッキーです - あなたは==What exactly is Type Coercion in Javascript?以上===)を使用するこの特定のケースでは代わりにgetArray()[0]= 42

getArray() = 42をする。

エラーの理由はOperator precedenceです。特に、&&(優先順位6)と=(優先順位3)を探しています。

者は優先順位に従って、式に括弧を入れてみましょう - &&=よりも高くなっているので、1が3+(4*5)+6として3+4*5+6を行うだろうか最初に似て実行されます。

if(one= ("rock" && two) = "rock"){... 

今、私たちはa = b = 42のような複数の割り当てに似た表現を持っていますa = (b = 42)として実行される右から左への結合性のために発生します。だから、もっとかっこを追加:

if(one= ( ("rock" && two) = "rock") ){... 

は最後に、私たちは実際の問題に到着しました:("rock" && two)(この特定のケースでは、それはtruthyとしてtwoになります)に割り当てることができ、Lの値に評価することはできません。

の認識優先度がである場合、中括弧で "平等"を囲む中括弧を使用するとエラーは発生しません。もちろんそれもあなたが期待と異なる結果を生成すること - 両方の変数の値を変更し、原因logial &&の行動に(順番にtruthyある)"rock"にすべての時間を結果"rock" && "rock"二つの文字列に&&を行うよりも:

if((one = "rock") && (two = "rock")) 
{ 
    // always executed, both one and two are set to "rock" 
    ... 
} 

エラーと、それを実現することができ、他の例についても、詳細については

- を参照して仕様:

Assignment

LeftHandSideExpression = AssignmentExpression
...
Throw a SyntaxError exception if the following conditions are all true:
...
IsStrictReference(lref) is true

IsStrictReferenceを説明

Left-Hand-Side Expressions

The Reference Specification Type

... function calls are permitted to return references. This possibility is admitted purely for the sake of host objects. No built-in ECMAScript function defined by this specification returns a reference and there is no provision for a user-defined function to return a reference...