Sederhananya, jika suatu variabel atau objek “unreachable”, maka variabel atau objek tersebut tidak perlu terus disimpan di memori dan harus didaur ulang.
Misalnya:
let xiaoming = {name:'xiaoming'}//Buat sebuah objek dan gunakan variabel xiaoming sebagai referensi xiaoming = null //Kosongkan variabel xiaoming, sehingga objek {name:'xiaoming'} tidak dapat dijangkau//{ name:'xiaoming'} Objek didaur ulang
Jika suatu objek direferensikan oleh array dan objek lain, selama array dan objek yang mereferensikannya ada dalam array, maka objek tersebut dianggap dapat dijangkau.
Objek dalam array:
let xiaoming = {name:'xiaoming'} biarkan arr = [xiaoming] xiaoming = null //Kosongkan variabel xiaoming //Objek {name:'xiaoming'} tidak akan dilepaskan karena ada dalam array.
Demikian pula, jika kita menggunakan objek sebagai kunci dari Map
, jika Map
ada , maka benda tersebut tidak akan didaur ulang oleh mesin.
Objek utama dalam Map
:
let xiaoming = {name:'xiaoming'} biarkan peta = Peta baru() map.set(xiaoming,'anak laki-laki') xiaoming = null //Kosongkan variabel xiaoming //Objek {name:'xiaoming'} tidak akan dilepaskan karena merupakan kunci dari peta.
WeapMap
pada dasarnya berbeda dari Map
dalam proses pelepasan objek kunci Sederhananya, WeapMap
tidak akan mencegah pengumpulan sampah karena objek sebagai kuncinya.
Perbedaan WeakMap
dan Map
dapat dibagi menjadi tiga aspek:
WeakMap
hanya dapat menggunakan objek sebagai kuncinyaletweakMap = new WeakMap() biarkan obj = {nama:'obj'} lemahMap.set(obj,'obj sebagai kuncinya') lemahMap.set('str','str as the key')//Hasil eksekusi kode error
sebagai berikut:
Terlihat ketika kita menggunakan string sebagai key
, program tidak dapat dijalankan secara normal.
Dengan kata lain, jika suatu objek tidak memiliki referensi lain kecuali referensi WeakMap
, maka objek tersebut akan didaur ulang oleh sistem.
Misalnya:
biarkan WeakMap = new WeakMap() biarkan obj = {nama:'obj'} lemahMap.set(obj,'obj sebagai kuncinya') obj = null //Buat variabel obj kosong //Saat ini, objek {name:'obj'} akan didaur ulang
WeakMap
mendukung metode terbatasWeakMap
tidak mendukung iterasiWeakMap
tidak mendukung keys()
WeakMap
tidak mendukung values()
WeakMap
tidak Mendukung entires()
, jadi kami tidak memiliki cara untuk mendapatkan semua pasangan nilai kunci.
WeakMap
hanya dapat menggunakan metode berikut:
weakMap.get(key)
Dapatkan pasangan nilai kunciweakMap.set(key,val)
Tetapkan pasangan nilai kunciweakMap.delete(key)
Hapus pasangan nilai kunciweakMap.has(key)
Tentukan apakah ituada Metode akses data WeakMap
harus dibatasi karena waktu pelepasan objek oleh mesin JavaScript
tidak dapat ditentukan.
Ketika sebuah objek kehilangan semua referensinya, mesin JavaScript
mungkin akan segera melepaskan ruang yang ditempati oleh objek tersebut, atau mungkin menunggu beberapa saat.
Oleh karena itu, pada saat tertentu, jumlah elemen WeakMap
tidak dapat ditentukan. (Bayangkan, jika kita melintasi elemen WeakMap
setelah suatu objek kehilangan semua referensinya, kita mungkin mendapatkan hasil yang berbeda.)
Skenario penerapan WeakMap
biasanya untuk menyimpan data yang "milik" suatu objek Saat ini, data "milik" objek ini juga harus dirilis.
Ada sebuah cerita sejarah yang sangat cocok untuk menggunakan WeakMap`: "Kelinci yang licik mati, antek-anteknya matang; burung-burung hilang, dan busur yang baik disembunyikan."
Jika kita menggambarkan cerita ini dalam kode JavaScript
, kita harus menggunakan WeakMap
:
letweakMap = new WeakMap() let Rabbit = {name:'rabbit'} //Kelinci yang licik let runDog = {name:'runDog'} //Anjing yang berlari let flyBird = {name:'flyBird'} //Burung yang terbang let goodBow = {name :'goodBow'} //Liang Gong lemahMap.set(kelinci,runDog) lemahMap.set(flyBird,goodBow) kelinci = null //Kelinci yang licik mati flyBird = null //Burung-burung telah pergi//Sebentar lagi, para antek dan busur yang baik akan dilepaskan, mungkin tidak segera //Kisah ini memberitahu kita bahwa tidak ada akhir yang baik untuk menjadi seorang antek, mungkin tidak langsung Dibunuh oleh //, tetapi cepat atau lambat akan dimatikan.Dibandingkan dengan Set,
Set
WeakSet
berikut:
WeakSet
hanya dapat menambahkan elemen objekWeakSet
add()
WeakSet
mencegah sistem mendaur ulang elemen.add()
, has()
, delete()
WeakSet
tidak mendukung atribut size
dan metode keys()
.WeakMap
dapat menggunakan WeakMap
untuk memverifikasi beberapa informasi keberadaan, atau memverifikasi status seperti "ya/tidak". untuk menentukan apakah pengguna sedang online:
let onlineUser = new WeakMap() biarkan zhangSan = {nama:'Zhang San'} biarkan liSi = {nama:'李思'} biarkan wangEr = {nama:'王二'} biarkan maZi = {nama:'Mazi'} fungsi login(pengguna){ ... ... onlineUser.add(pengguna) } //Tentukan apakah pengguna sedang online fungsi isOnline(pengguna){ kembali onlineUser.has(pengguna) }
Keterbatasan WeakMap
dan WeakSet
adalah mereka tidak dapat melakukan iterasi dan mendapatkan semua elemen sekaligus, sehingga tidak mempengaruhi peran pentingnya di tempat yang sangat kritis.
WeakMap
hanya dapat menggunakan objek sebagai kunci. Ketika semua referensi eksternal ke kunci hilang (tidak ada variabel lain kecuali WeakMap
yang merujuk ke objek kunci), WeakMap
tidak akan mencegah mesin mendaur ulang nilai kunci. Setelah didaur ulang, elemen WeakMap
yang terkait tidak ada lagi.WeakSet
hanya dapat menyimpan objek. Setelah elemen objek kehilangan semua referensi eksternal (kecuali WeakSet
, tidak ada variabel lain yang merujuk ke objek elemen), WeakSet
tidak akan mencegah mesin mendaur ulang elemen tersebut. Setelah didaur ulang, elemen terkait di WeakSet
menghilang.clear()
, size
, keys()
, values()
tidak didukung. WeakMap
dan WeakSet
sering digunakan untuk menyimpan struktur data yang terkait dengan objek "utama". struktur data terkait dihapus secara alami.