エラーの
一般的な理由:代わりに、引数(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...
3 "タイ" の場合は、単一の 'IF(1 == 2)' –