JavaScript - Objek WeakSet

Halo, para programer yang sedang belajar! Hari ini, kita akan mengexplore fitur menarik namun seringkali dilewati di JavaScript: objek WeakSet. Jangan khawatir jika Anda baru belajar programming; saya akan mengajarkan Anda konsep ini secara langkah demi langkah, seperti yang saya lakukan untuk ribuan murid selama tahun-tahun mengajar saya. Jadi, ambil minuman kesukaan Anda, duduk nyaman, dan mari kita masuk ke dalamnya!

JavaScript - WeakSet

Apa Itu WeakSet?

Sebelum kita masuk ke detilnya, mari pahami apa itu WeakSet. Bayangkan Anda punya sebuah kotak khusus tempat Anda hanya bisa menaruh mainan unik, tapi mainan itu secara magis menghilang ketika tidak ada yang mainkan lagi. Itu seperti WeakSet di JavaScript!

WeakSet adalah sebuah koleksi objek, tapi dengan beberapa karakteristik khusus:

  1. Itu hanya bisa menyimpan objek, bukan nilai primitif.
  2. Objek di WeakSet direferensikan lemah, artinya mereka bisa dibuang oleh垃圾回收 (garbage collected) jika tidak ada referensi lain kepadanya.
  3. WeakSet tidak dapat dihitung (not enumerable), jadi Anda tidak bisa melooping melalui mereka.

Sekarang, mari kita lihat bagaimana membuat dan menggunakan WeakSet.

Sintaks

Membuat WeakSet sangat mudah. Berikut cara Anda melakukannya:

let myWeakSet = new WeakSet();

Itu saja! Anda baru saja membuat WeakSet kosong. Sekarang, mari kita tambahkan beberapa objek ke dalamnya.

let obj1 = { name: "Alice" };
let obj2 = { name: "Bob" };

myWeakSet.add(obj1);
myWeakSet.add(obj2);

console.log(myWeakSet.has(obj1)); // Output: true
console.log(myWeakSet.has(obj2)); // Output: true

Dalam contoh ini, kita membuat dua objek dan menambahkannya ke WeakSet kita. Metode has() memeriksa apakah objek ada di WeakSet.

Properti WeakSet

Sekarang, Anda mungkin bertanya-tanya, "WeakSet punya properti apa?" Well, ini adalah fakta menarik: WeakSets tidak punya properti! Ya, benar, nol, nihil, kosong! Hal ini karena WeakSets dirancang untuk ringan dan tidak memantau ukuran atau isi mereka.

Metode WeakSet

Meskipun WeakSets tidak punya properti, mereka memiliki beberapa metode yang berguna. Mari kita lihat mereka dalam tabel:

Metode Deskripsi
add(value) Menambahkan objek baru ke WeakSet
delete(value) Menghapus objek tertentu dari WeakSet
has(value) Memeriksa apakah objek tertentu ada di WeakSet

Mari kita lihat metode-metode ini dalam aksi:

let weakSet = new WeakSet();
let obj = { id: 1 };

// Menambahkan objek
weakSet.add(obj);
console.log(weakSet.has(obj)); // Output: true

// Mencoba menghapus objek
weakSet.delete(obj);
console.log(weakSet.has(obj)); // Output: false

// Mencoba menambahkan nilai non-objek (akan melempar kesalahan)
try {
weakSet.add(1);
} catch(error) {
console.log("Error:", error.message);
}
// Output: Error: Invalid value used in weak set

Dalam contoh ini, kita menggunakan semua tiga metode WeakSet. Catatlah bagaimana mencoba menambahkan nilai non-objek (seperti angka 1) melempar kesalahan. Ingat, WeakSets hanya untuk objek!

Contoh

Sekarang kita telah melihat dasar-dasar, mari kita lihat beberapa contoh praktis ketika Anda mungkin menggunakan WeakSet.

Contoh 1: Melacak kunjungan objek

Bayangkan Anda membuat sebuah website dan ingin melacak halaman mana yang dikunjungi pengguna, tapi hanya saat mereka sedang menjelajah:

let visitedPages = new WeakSet();

class Page {
constructor(url) {
this.url = url;
}

visit() {
visitedPages.add(this);
console.log(`Visited: ${this.url}`);
}

hasVisited() {
return visitedPages.has(this);
}
}

let homePage = new Page("https://example.com");
let aboutPage = new Page("https://example.com/about");

homePage.visit(); // Output: Visited: https://example.com
console.log(homePage.hasVisited()); // Output: true
console.log(aboutPage.hasVisited()); // Output: false

Dalam contoh ini, kita menggunakan WeakSet untuk melacak objek Page yang dikunjungi. WeakSet memungkinkan objek Page dibuang oleh垃圾回收 (garbage collected) saat mereka tidak lagi diperlukan, yang bagus untuk manajemen memori!

Contoh 2: Mencegah pengolahan duplikat

mari kita katakan Anda menulis program yang mengolah data pengguna, tapi Anda ingin memastikan bahwa setiap pengguna hanya diproses sekali:

let processedUsers = new WeakSet();

function processUser(user) {
if (processedUsers.has(user)) {
console.log(`User ${user.name} sudah diproses.`);
return;
}

// Proses pengguna...
console.log(`Processing user: ${user.name}`);
processedUsers.add(user);
}

let user1 = { name: "Alice" };
let user2 = { name: "Bob" };

processUser(user1); // Output: Processing user: Alice
processUser(user2); // Output: Processing user: Bob
processUser(user1); // Output: User Alice sudah diproses.

Dalam contoh ini, kita menggunakan WeakSet untuk melacak pengguna yang sudah diproses. Hal ini mencegah pengolahan duplikat dan efisien memori karena jika objek pengguna tidak lagi direferensikan di tempat lain dalam kode Anda, mereka bisa dibuang bersamaan dengan entri mereka di WeakSet.

Kesimpulan

Dan begitu, teman-teman! Kita telah mengeksplor dunia mistik WeakSets di JavaScript. Ingat, WeakSets seperti teman yang keren dan minimalistik yang tidak suka menahan hal-hal untuk waktu yang lama. Mereka sempurna saat Anda ingin menghubungkan objek dengan suatu keadaan atau perilaku, tapi Anda tidak ingin mencegah objek itu dibuang oleh垃圾回收.

WeakSets mungkin bukan sesuatu yang Anda gunakan setiap hari, tetapi memahaminya menambahkan alat kuat ke dalam peralatan JavaScript Anda. Siapa tahu? Suatu hari, Anda mungkin menemukan diri Anda dalam situasi di mana WeakSet adalah precisely apa yang Anda butuhkan untuk mengatasi masalah yang sulit.

Terus coding, tetap curioso, dan ingat: di dunia programming, ada selalu sesuatu yang baru untuk dipelajari!

Credits: Image by storyset