? Referensi kuat dalam JavaScript: Referensi suatu objek adalah referensi kuat dalam JavaScript, yaitu ketika将一个引用对象通过变量或常量保存
, maka variabel atau konstanta tersebut adalah referensi kuat, dan objeknya tidak akan menjadi Recycle.
Referensi lemah di JavaScript: WeakMaps dan WeakSets adalah satu-satunya cara kita dapat menggunakan referensi lemah di JavaScript.将一个对象作为键添加
ke WeakMap atau WeakSet tidak mencegah objek ini didaur ulang.
. Referensi kuat adalah seorang anak A yang sedang menggendong seekor anjing, dan mereka dihubungkan dengan rantai anjing.
Acuan yang lemah adalah ada orang B yang menunjuk pada anjing yang dipegang oleh A dan berkata: Hei, ada seekor anjing di sana, dan B menunjuk pada anjing itu, tetapi tidak ada yang terikat di antara mereka.
Ketika A melepaskan tali pengikat anjingnya, anjing tersebut akan lari (sampahnya dikumpulkan), terlepas dari apakah B masih menunjuk.
Namun, ketika B tidak lagi menunjuk ke arah anjingnya, anjing tersebut masih dipegang oleh A, yang tidak akan mempengaruhi apakah ia melarikan diri.
let people = {name:'Zhang San',age:25} let people1 = people;
Dalam kode di atas, ketika kita menetapkan {name:'张三',age:25}
ke variabel people, akan ada garis yang menghubungkan mereka di memori:
Kemudian buat variabel people1 dan tetapkan people ke people1, yang setara dengan people1 yang juga mereferensikan objek ini:
Mari kita lihat apa yang terjadi ketika kita menggunakan tipe WeakSet dan WeakMap yang baru diperkenalkan di ES6 untuk menyimpan nilai referensi.
biarkan orang = {nama:'Zhang San',umur:25} biarkan orang1 = orang; biarkan set = new WeakSet(); set.add(people);
Kami membuat instance WeakSet() baru dan menambahkan orang melalui metode add. Nilai referensi yang sesuai dengan people adalah {name:'张三',age:25}
.
Dapat dilihat bahwa nilai {name:'张三',age:25}
dalam instance set mengacu pada {name:'张三',age:25}
(dalam memori sebenarnya, ini menunjuk ke tumpukan data Referensi penunjuk, tumpukan menunjuk ke nilai alamat yang sesuai di tumpukan yang sesuai). Dan penting untuk dicatat bahwa "garis" referensi lemah ini transparan. Apa perbedaan antara kutipan ini dan kutipan kuat?
Ringkasan satu kalimat: Referensi yang kuat dikenali sebagai "koneksi" dengan referensi {name:'张三',age:25}
, sedangkan referensi yang lemah tidak dikenali. Artinya, referensi tidak mengetahui bahwa referensi tersebut direferensikan oleh instance yang ditetapkan.
Ini berarti pengumpulan sampah tidak mengetahui bahwa referensi tersebut direferensikan oleh instance yang ditetapkan. Kemudian jika semua koneksi referensi yang kuat dari referensi tersebut terputus (variabel ditetapkan ke null atau keadaan lain), maka referensi tersebut akan dimusnahkan sebagai sampah, bahkan jika instance yang ditetapkan masih merujuk ke referensi tersebut.
biarkan orang = {nama:'Zhang San',umur:25} biarkan orang1 = orang; biarkan set = new WeakSet(); set.add(orang); orang = nol; people1 = null;
Apa yang akan terjadi jika kita memutuskan semua referensi kuat?
Karena semua referensi kuat terputus, pengumpulan sampah menganggap bahwa referensi {name:'张三',age:25}
tidak lagi diperlukan, dan akan menghancurkannya. Kemudian referensi yang digunakan oleh instance set yang bersangkutan tidak ada lagi, meskipun instance set tersebut masih menggunakan referensi tersebut.
1. Referensi ke objek di WeakSet adalah referensi lemah. Artinya, meskipun set lemah "merujuk" suatu objek, pengumpulan sampah tidak menghitung referensi ini sebagai "referensi". selama tidak ada referensi kuat di tempat lain. Objek ini tidak dapat dijangkau dan dapat didaur ulang kapan saja; objek ini hanya dapat menyimpan jenis referensi dan tidak dapat dihitung atau dihapus.
2. WeakMap mirip dengan Map, tetapi tidak dapat dihitung, tidak dapat dihapus, dan objek yang direferensikan dengan kunci adalah referensi yang lemah.
3. WeakSet cocok untuk menyimpan sementara sekelompok objek dan menyimpan informasi yang terikat pada objek tersebut. Selama objek-objek ini menghilang secara eksternal, referensinya di WeakSet akan otomatis hilang. Karena ciri-ciri di atas, anggota WeakSet tidak cocok untuk dijadikan referensi karena sewaktu-waktu dapat menghilang.
4. Referensi yang kuat terkadang lupa melakukan dereferensi sehingga menyebabkan memori tidak dapat dilepaskan sehingga dapat menyebabkan kebocoran memori. Referensi yang lemah tidak disertakan dalam mekanisme pengumpulan sampah, jadi masalah ini tidak ada.