Object adalah cara JavaScript mengelompokkan data yang saling berhubungan menjadi satu kesatuan bernama — seorang pengguna punya nama, email, dan peran; sebuah konfigurasi punya tema, bahasa, dan opsi notifikasi. Di aplikasi Node.js, object adalah format data paling dominan: hasil JSON.parse(), baris hasil query database, dan opsi konfigurasi module semuanya berbentuk object. Pada chapter ini kita akan membentuk object dengan property shorthand, membongkarnya dengan destructuring, menggabungkannya dengan spread, lalu mengakses data yang tidak pasti lengkap dengan optional chaining dan nullish coalescing dengan aman.
Property Shorthand dan Destructuring #
Sering kali kita punya variabel yang ingin dimasukkan ke object dengan nama property yang sama persis. ES 2015 memperbolehkan penulisan { nama, email } sebagai singkatan { nama: nama, email: email }. Sebaliknya, destructuring mengambil property object keluar ke variabel dengan satu baris — pola yang menggantikan akses berulang pengguna.nama, pengguna.email di setiap baris. Keduanya dirangkum dalam destructuring.mjs:
const nama = "Budi";
const email = "[email protected]";
// Property shorthand: nama property diambil dari nama variable
const pengguna = { nama, email, peran: "admin" };
// Destructuring dengan nama baru dan nilai bawaan
const { nama: namaPengguna, umur = 25 } = pengguna;
// Nested destructuring: ambil property di dalam property
const laporan = {
judul: "Laporan Mingguan",
penulis: { nama: "Siti", kota: "Bandung" },
};
const {
penulis: { nama: namaPenulis, kota },
} = laporan;
console.log(`pengguna : ${pengguna.nama} <${pengguna.email}> peran ${pengguna.peran}`);
console.log(`ganti : ${namaPengguna}, umur ${umur}`);
console.log(`penulis : ${namaPenulis} dari ${kota}`);Output yang Dihasilkan:
pengguna : Budi <[email protected]> peran admin
ganti : Budi, umur 25
penulis : Siti dari BandungMari kita bedah pola-pola pada kode di atas:
- Baris 6 (
{ nama, email, peran: "admin" }):namadanemailmemakai shorthand, sementaraperanditulis lengkap karena nilainya bukan dari variabel bernama sama. - Baris 9 (
const { nama: namaPengguna, umur = 25 } = pengguna): propertynamadibongkar ke variabel baru bernamanamaPengguna. Propertyumurtidak ada di object, jadi nilai bawaan25yang dipakai. - Baris 16-19 (nested destructuring): pola
penulis: { nama: namaPenulis, kota }menelusuri dua lapis — ambil propertypenulis, lalu dari object tersebut ambilnama(di-rename) dankota.
Destructuring juga bekerja pada parameter function, dan justru di situlah pola ini paling bersinar. Sebuah function yang menerima opsi seperti function buatServer({ host, port, debug = false }) bisa dipanggil dengan object bernama propertinya, sehingga urutan argumen tidak lagi relevan. Kita akan memakai pola ini terus-menerus saat berkenalan dengan API Express dan Fastify pada Section Framework dan Middleware.
Spread untuk Menggabungkan Object #
Operator spread ... “membentangkan” property sebuah object ke dalam object lain. Dua kegunaan utamanya: menggabungkan konfigurasi dengan aturan “yang belakangan menang”, dan menyalin object sebelum memodifikasinya agar data asli tetap utuh. Perhatikan spread.mjs:
const bawaan = { tema: "terang", bahasa: "id", notifikasi: true };
const pilihanPengguna = { tema: "gelap", notifikasi: false };
// Spread menggabungkan: property dari object di kanan menimpa yang di kiri
const pengaturan = { ...bawaan, ...pilihanPengguna };
// Salin object sebelum dimodifikasi agar object asli tidak berubah
const cadangan = { ...pengaturan };
cadangan.tema = "biru";
console.log(`tema : ${pengaturan.tema}`);
console.log(`bahasa : ${pengaturan.bahasa}`);
console.log(`notifikasi : ${pengaturan.notifikasi}`);
console.log(`tema cadangan : ${cadangan.tema}`);
console.log(`tema asli : ${pengaturan.tema}`);Output yang Dihasilkan:
tema : gelap
bahasa : id
notifikasi : false
tema cadangan : biru
tema asli : gelapPembacaan hasilnya:
- Hasil gabungan:
temamenjadi"gelap"karenapilihanPenggunaberada di posisi kanan dan menimpa nilai bawaan;bahasatetap"id"karena tidak pernah ditimpa. - Salinan aman: mengubah
cadangan.tematidak menyentuhpengaturan.tema— keduanya adalah object berbeda. Tanpa spread,const cadangan = pengaturanhanya menyalin referensi sehingga mutasi pada satu sisi terlihat di sisi lain.
Optional Chaining dan Nullish Coalescing #
Data dari luar — berkas konfigurasi, API pihak ketiga, hasil query — tidak selalu lengkap. Optional chaining ?. membuat akses berantai berhenti dengan aman menghasilkan undefined alih-alih melempar TypeError di tengah jalan, dan nullish coalescing ?? menyediakan nilai cadangan hanya ketika operand kirinya null atau undefined. Berkas opsional.mjs memperlihatkan keduanya:
const pengguna = {
nama: "Dewi",
alamat: null,
preferensi: { notifikasi: false },
};
// Optional chaining: akses berantai berhenti dengan aman saat bertemu null
const kota = pengguna.alamat?.kota;
const kodePos = pengguna.alamat?.kodePos ?? "tidak tercatat";
// Nullish coalescing: hanya mengganti nilai bila null atau undefined
const notifikasi = pengguna.preferensi?.notifikasi ?? true;
console.log(`kota : ${kota}`);
console.log(`kode pos : ${kodePos}`);
console.log(`notifikasi : ${notifikasi}`);
console.log("perbandingan || versus ??");
console.log(` false || true -> ${false || true}`);
console.log(` false ?? true -> ${false ?? true}`);Output yang Dihasilkan:
kota : undefined
kode pos : tidak tercatat
notifikasi : false
perbandingan || versus ??
false || true -> true
false ?? true -> falseTiga pengamatan dari output di atas:
pengguna.alamatbernilainull, jadipengguna.alamat?.kotalangsung menghasilkanundefinedtanpa pernah mencoba membaca.kotadarinull.pengguna.preferensi?.notifikasimenghasilkanfalse— nilai yang sah. Berkat??, nilaifalseini dipertahankan, bukan digantitrue.- Baris terakhir memperlihatkan perbedaan krusial:
false || truemenghasilkantruekarena||menganggap semua nilai falsy layak diganti, sedangkanfalse ?? truemenghasilkanfalse. Inilah alasan??adalah pilihan yang benar untuk nilai boleh-false,"0", atau0.
Menjelajah Isi Object #
Ketika nama property tidak bisa kita tulis satu per satu — misalnya property-nya dinamis — kita butuh cara memutar isi object. Tiga method statis Object menjadi andalan: Object.keys() mengembalikan array nama property, Object.values() mengembalikan array nilainya, dan Object.entries() mengembalikan array pasangan [nama, nilai]. Berkas menjelajah-object.mjs menerapkan ketiganya pada data stok:
const stok = {
kopi: 12,
teh: 30,
susu: 8,
};
console.log(`keys : ${Object.keys(stok).join(", ")}`);
console.log(`values : ${Object.values(stok).join(", ")}`);
let total = 0;
Object.entries(stok).forEach(([barang, jumlah]) => {
console.log(`- ${barang}: ${jumlah} pcs`);
total += jumlah;
});
console.log(`total : ${total} pcs`);Output yang Dihasilkan:
keys : kopi, teh, susu
values : 12, 30, 8
- kopi: 12 pcs
- teh: 30 pcs
- susu: 8 pcs
total : 50 pcsUrutan yang tercetak bukan kebetulan: Object.keys(), Object.values(), dan Object.entries() mengikuti urutan property bernama string sesuai urutan penulisan, sehingga output-nya stabil dan bisa diandalkan. Callback forEach menerima setiap pasangan [barang, jumlah] — destructuring array di parameter, keluarga dekat dari destructuring object yang baru saja kita pelajari — lalu mencetak baris stok sekaligus menjumlahkan totalnya.
Referensi lanjutan untuk topik chapter ini:
Object sangat cocok untuk data yang tiap elemennya punya nama, tetapi banyak data di dunia nyata berbentuk daftar berurutan — daftar tugas, daftar harga, daftar baris database. Untuk itu JavaScript menyediakan array lengkap dengan higher-order function-nya, topik Chapter Array dan Higher-Order Function.