Kita semua tahu bahawa tugasan dalam JavaScript adalah dari kanan ke kiri
var a = b = c
Pernyataan di atas sebenarnya dilaksanakan seperti ini
b = c
var a = b
Tetapi bagaimana jika seseorang terlibat? Contoh yang saya nampak semalam
var foo = { a: 2 }
var bar = foo
foo.x = foo = { b: 3 }
Dua baris pertama sangat mudah, ia menunjuk bar ke foo.
Dalam baris ketiga, foo = { b: 3 } dilaksanakan pada permulaan, yang mengubah hala foo ke objek lain.
Ayat seterusnya foo.x = foo, saya pada asalnya fikir foo itu.
foo = {
b: 3,
x: {
b: 3,
x: {
b: 3,
x: {
......
}
}
}
}
Tetapi ujian sebenar mendapati bahawa foo.x dalam ayat foo Tetapi adakah pelaksanaan sebenar adalah dari kanan ke kiri?
Saya baru saja melihat penjelasan yang hebat daripada seorang tuan (saya sedang menyemak maklumat anggaran penetapan objek yang berterusan adalah ini: foo.x = foo = { b: 3 }, dalam penterjemah Semasa pelaksanaan, mula-mula semak sama ada foo.x dan foo telah dicipta. Jika tidak, buat dan arahkan kedua-duanya ke objek paling kanan kali ini, bar dan foo kedua-duanya menunjuk ke {a:2,x:null}, dan kemudian halakan kedua-duanya ke objek di sebelah kanan {b:3}. {b :3}}, foo menunjuk ke {b:3};
Kami baru sahaja membincangkan isu ini baru-baru ini, dan kami membuat kesimpulan bahawa:
foo.x
中的foo
实际是对{ a: 2 }
adalah rujukan, tetapi perintah pelaksanaan masih dari kanan ke kiri, tidak ada keraguan mengenainya.Tugasan ialah ungkapan,
Associativity adalah dari kanan ke kiri, iaitu,
a = b = c
ialaha = (b = c)
a = b = c
是a = (b = c)
返回值是,等号右边那个表达式的返回值,即
b = c
的返回值是c
Nilai pulangan ialah nilai pulangan ungkapan di sebelah kanan tanda sama, iaitu nilai pulanganb = c
ialah nilaic kod>.
Tempatan kiri ke kanan (.), makro kanan ke kiri (=). Foo ini bukan foo itu.
Apabilamembaca foo kedua, ia telah memperoleh rujukan
{ a: 2 }
daripada foo pertama dan sedang menunggu untuk memberikan nilai kepada atribut xnya.Tugasan adalah dari kanan ke kiri, tetapi kod mesti diproses sebelum pelaksanaan
foo.x = foo = { b: 3 }
,对属性的处理是按值进行的,即此时已经定位到了{ a: 2 }
Lokasi storan sebenar objek ini dan tugasan kepada atribut x juga merupakan tugasan kepada atribut x objek sebenar. , sama ada ia adalah foo Objek yang ditunjuk masih objek yang ditunjuk oleh bar. Tugasan kepada objek mengubah alamat objek sebenar yang disimpan dalam objek, iaitu menukar penunjuk foo.Saya rasa cara penulisan ini tidak masuk akal.
Dalam pengeluaran sebenar, jika anda menemui banyak kod sedemikian, bolehkah anda memahaminya dengan sepintas lalu?
Sama seperti sekarang, berapa ramai orang yang menjawab soalan-soalan sebelum ini boleh menerangkannya dalam istilah orang awam?
/a/11...
Tetapi sebenarnya melaksanakan tiga pernyataan di atas mengikut tertib, hasilnya akan berbeza, kerana foo.x telah disediakan semasa peringkat penghuraian, jadi ia sebenarnya menunjuk ke bar.x
kod yang setara sebenarnya
Anda boleh menggunakan penunjuk untuk memahami masalah ini