Learn
← Previous Next →

Hari 27: Metaprogramming & Symbols

55 min Last updated 09 Apr 2026

Symbol — Identifier Unik

const ID      = Symbol("id");
const PRIVATE = Symbol("private");

const obj = {
    [ID]: 12345,      // symbol sebagai key
    nama: "Budi",
};

console.log(obj[ID]);          // 12345
console.log(typeof ID);        // "symbol"
console.log(ID.toString());    // "Symbol(id)"
console.log(ID === Symbol("id")); // false — setiap Symbol unik!

Well-known Symbols

class Koleksi {
    #items;
    constructor(...items) { this.#items = items; }

    // Buat Koleksi iterable
    [Symbol.iterator]() {
        return this.#items[Symbol.iterator]();
    }

    // Custom toString
    [Symbol.toPrimitive](hint) {
        if (hint === "string") return `Koleksi(${this.#items.join(", ")})`;
        return this.#items.length;
    }
}

const k = new Koleksi(1, 2, 3, 4, 5);
console.log([...k]);        // [1, 2, 3, 4, 5]
console.log(`${k}`);        // Koleksi(1, 2, 3, 4, 5)
console.log(k + 10);        // 15

💡 Notice: Symbol.iterator memungkinkan objek custom untuk di-iterate dengan for..of dan spread operator. Iterator harus return objek dengan method next().

Assignment

Buat class Stack yang menggunakan Symbol.iterator agar bisa di-spread dan di-iterate dengan for..of. Tambah elemen lewat push(), hapus dengan pop(), dan iterasi dari atas ke bawah.

Expected output:

Size: 4
4, 3, 2, 1
JS script.js
Solution
Output