JavaScript での代入は右から左へ行われることは誰もが知っています
リーリー上記のステートメントは実際には次のように実行されます
リーリーしかし、オブジェクトが関係している場合はどうなるでしょうか?昨日見た例
リーリー最初の 2 行は非常に単純で、bar から foo を指すだけです。
3 行目では、最初に foo = { b: 3 } が実行され、foo が別のオブジェクトにリダイレクトされます。
次の文 foo.x = foo、私は當(dāng)初、foo.x は foo を指していると考えていたため、foo はそれ自體を循環(huán)的に參照するオブジェクト、つまり
になります。 リーリーしかし、実際のテストでは、foo という文の中に foo.x が見つかりました。そうですが、実際の実行は右から左へ行われるのでしょうか?
偉大なマスターからの良い説明を見ました(情報(bào)を確認(rèn)中です)。オブジェクトの連続代入のおおよその説明は次のとおりです。最初はインタプリタの実行中に foo.x = foo = { b: 3 }。 foo.x と foo が作成されているかどうかを確認(rèn)します。作成されていない場合は、両方を右端のオブジェクトにポイントします。明らかに foo が作成され、{ a: 2 } をポイントします。foo.x はまだ作成されていないので、作成します。このとき、bar と foo は両方とも {a:2,x:null} を指し、次に両方とも右側(cè)のオブジェクト {b:3} を指します。 {a:2,x:{b:3} },foo は {b:3} を指します。
私たちは最近この問題について議論したところ、次のような結(jié)論に達(dá)しました: foo.x
中的 foo
實(shí)際是對 { a: 2 }
は參照ですが、実行順序は依然として右から左であり、これについては疑いの余地がありません。
代入は式です。
結(jié)合性は右から左です。つまり、a = b = c
は a = (b = c)
です。a = b = c
是a = (b = c)
返回值是,等號右邊那個(gè)表達(dá)式的返回值,即 b = c
的返回值是c
戻り値は、數(shù)値の右側(cè)の式の戻り値、つまり b = c
の戻り値は、c
の値になります。
ローカルは左から右 (.)、マクロは右から左 (=)。この foo はあの foo ではありません。
リーリー が 2 番目の foo を読み取るとき、すでに最初の foo から { a: 2 }
の參照を取得しており、その x 屬性に値を割り當(dāng)てるのを待っています。
代入は右から左へ行われますが、コードは実行前に処理する必要があります。 foo.x = foo = { b: 3 }
,對屬性的處理是按值進(jìn)行的,即此時(shí)已經(jīng)定位到了{ a: 2 }
このオブジェクトの実際の格納場所は、それが指すオブジェクトであるかどうかに関係なく、実際のオブジェクトの x 屬性への代入でもあります。 to foo または bar が指すオブジェクト。オブジェクトに代入すると、そのオブジェクトに格納されている実際のオブジェクトのアドレスが変更されます。つまり、foo のポインタが変更されます。
この書き方は意味がないと思います。
実際の運(yùn)用で、このようなコードがたくさん出てきたら、一目で理解できますか?
今と同じように、前の質(zhì)問に答えてくれた人の中で、わかりやすく説明できる人は何人いるでしょうか?
リーリー リーリー
しかし、実際に上記の 3 つのステートメントを順番に実行すると、結(jié)果は異なります。foo.x は解析段階で準(zhǔn)備されており、実際には bar.x を指しているためです。
実際の同等のコードリーリー