JavaScript での代入は右から左へ行われることは誰もが知っています
リーリー上記のステートメントは実際には次のように実行されます
リーリーしかし、オブジェクトが関係している場合はどうなるでしょうか?昨日見た例
リーリー最初の 2 行は非常に単純で、bar から foo を指すだけです。
3 行目では、最初に foo = { b: 3 } が実行され、foo が別のオブジェクトにリダイレクトされます。
次の文 foo.x = foo、私は当初、foo.x は foo を指していると考えていたため、foo はそれ自体を循環的に参照するオブジェクト、つまり
になります。 リーリーしかし、実際のテストでは、foo という文の中に foo.x が見つかりました。そうですが、実際の実行は右から左へ行われるのでしょうか?
偉大なマスターからの良い説明を見ました(情報を確認中です)。オブジェクトの連続代入のおおよその説明は次のとおりです。最初はインタプリタの実行中に foo.x = foo = { b: 3 }。 foo.x と foo が作成されているかどうかを確認します。作成されていない場合は、両方を右端のオブジェクトにポイントします。明らかに foo が作成され、{ a: 2 } をポイントします。foo.x はまだ作成されていないので、作成します。このとき、bar と foo は両方とも {a:2,x:null} を指し、次に両方とも右側のオブジェクト {b:3} を指します。 {a:2,x:{b:3} },foo は {b:3} を指します。
私たちは最近この問題について議論したところ、次のような結論に達しました:
リーリーfoo.x
中的foo
实际是对{ a: 2 }
は参照ですが、実行順序は依然として右から左であり、これについては疑いの余地がありません。代入は式です。
結合性は右から左です。つまり、
a = b = c
はa = (b = c)
です。a = b = c
是a = (b = c)
返回值是,等号右边那个表达式的返回值,即
b = c
的返回值是c
戻り値は、数値の右側の式の戻り値、つまりb = c
の戻り値は、c
の値になります。ローカルは左から右 (.)、マクロは右から左 (=)。この foo はあの foo ではありません。
リーリーが 2 番目の foo を読み取るとき、すでに最初の foo から
{ a: 2 }
の参照を取得しており、その x 属性に値を割り当てるのを待っています。代入は右から左へ行われますが、コードは実行前に処理する必要があります。
foo.x = foo = { b: 3 }
,对属性的处理是按值进行的,即此时已经定位到了{ a: 2 }
このオブジェクトの実際の格納場所は、それが指すオブジェクトであるかどうかに関係なく、実際のオブジェクトの x 属性への代入でもあります。 to foo または bar が指すオブジェクト。オブジェクトに代入すると、そのオブジェクトに格納されている実際のオブジェクトのアドレスが変更されます。つまり、foo のポインタが変更されます。この書き方は意味がないと思います。
実際の運用で、このようなコードがたくさん出てきたら、一目で理解できますか?
今と同じように、前の質問に答えてくれた人の中で、わかりやすく説明できる人は何人いるでしょうか?
/a/11...
リーリー リーリー
しかし、実際に上記の 3 つのステートメントを順番に実行すると、結果は異なります。foo.x は解析段階で準備されており、実際には bar.x を指しているためです。
実際の同等のコードリーリー
この問題を理解するにはポインターを使用できます