Sejauh ini kita mengakses object dengan mengetahui nama key-nya lebih dulu. Namun banyak pekerjaan justru dimulai dari ketidaktahuan itu: menghitung total stok tanpa tahu daftar produknya, mengubah seluruh nilai di dalam object, atau memeriksa kunci apa saja yang dimiliki sebuah konfigurasi. Untuk itu JavaScript menyediakan keluarga static method di object Object — perangkat yang dipanggil lewat Object.namaMethod(...) dan tidak memerlukan object apa pun di depannya.
Chapter ini membahas lima yang paling sering dipakai: Object.keys, Object.values, dan Object.entries untuk melihat isi, Object.assign untuk menggabungkan, Object.fromEntries untuk membangun ulang, serta Object.freeze untuk membekukan. Kita akan membuktikan bahwa freeze berlaku senyap di script biasa tetapi menimbulkan TypeError di modul yang berjalan ketat.
Tiga Cara Melihat Isi Object #
Ketiga method ini mengembalikan array — dan karena array sudah kita kuasai di section Arrays, seluruh perangkat array (length, index, map, forEach) langsung bisa dipakai terhadapnya:
const warna = { primer: "merah", sekunder: "kuning" };
console.log(Object.keys(warna));
console.log(Object.values(warna));
console.log(Object.entries(warna));Output yang Dihasilkan:
[ 'primer', 'sekunder' ]
[ 'merah', 'kuning' ]
[ [ 'primer', 'merah' ], [ 'sekunder', 'kuning' ] ]Object.keys mengembalikan daftar nama key; Object.values daftar nilainya; Object.entries mengemas keduanya sebagai array dua elemen [kunci, nilai] untuk setiap properti. Saat ditampilkan lewat console.log di Node, entries tercetak persis seperti di atas — array di dalam array dengan tanda kutip tunggal. Bila ingin keluaran yang lebih stabil untuk dibaca atau dicocokkan, bungkus dengan JSON.stringify, yang menghasilkan satu string JSON.
Karena hasilnya array, format laporan pun mudah dirakit dengan forEach dari section Arrays. Setiap pasangan dibaca lewat index 0 untuk kunci dan 1 untuk nilai — atau langsung diberi nama lewat destructuring di parameternya:
const nilai = { matematika: 88, web: 95, basis: 90 };
Object.entries(nilai).forEach(function (pasangan) {
console.log(pasangan[0] + ": " + pasangan[1]);
});Output yang Dihasilkan:
matematika: 88
web: 95
basis: 90Perhatikan bahwa parameter pasangan adalah array dua elemen, sehingga pasangan[0] adalah nama mata pelajaran dan pasangan[1] adalah nilainya. Tiga baris keluaran dihasilkan tanpa perlu mengakses object nilai lagi — seluruh informasi sudah tersedia di dalam pasangan.
Soal urutan: untuk key berupa string biasa (bukan bentuk angka), array yang dikembalikan mengikuti urutan penulisan properti — yang ditulis lebih dulu muncul lebih dulu, persis seperti pada stok. Pengecualian hanya pada key berbentuk angka, yang selalu dikelompokkan lebih dulu dalam urutan menaik. Karena itu ketiga method ini bisa diandalkan untuk menampilkan data dengan urutan yang stabil.
Contoh Lengkap: Inventaris Toko #
Berkas berikut memakai ketiga method untuk menghitung nilai stok, lalu memakai fromEntries dan assign untuk membentuk object baru:
// inventaris-toko.js
// Object.keys, Object.values, Object.entries, Object.assign, Object.fromEntries.
const stok = {
"Kopi Gayo": 24,
"Teh Melati": 31,
"Cokelat Bubuk": 17
};
const hargaSatuan = {
"Kopi Gayo": 45000,
"Teh Melati": 12000,
"Cokelat Bubuk": 38000
};
// tiga cara melihat isi object dari luar
console.log(Object.keys(stok));
console.log(Object.values(stok));
console.log(Object.entries(stok));
// keys sebagai penghubung dua object untuk menghitung nilai stok
let total = 0;
const daftarKunci = Object.keys(stok);
for (let i = 0; i < daftarKunci.length; i++) {
total += stok[daftarKunci[i]] * hargaSatuan[daftarKunci[i]];
}
console.log("Total nilai stok: Rp" + total);
// entries + map + fromEntries: menaikkan seluruh stok 10 unit
const stokBaru = Object.fromEntries(
Object.entries(stok).map(([nama, jumlah]) => [nama, jumlah + 10])
);
console.log(JSON.stringify(stokBaru));
// Object.assign dengan target kosong: menggabung tanpa mengubah object asal
const info = { toko: "Toko Sinar" };
const lengkap = Object.assign({}, info, { status: "buka" });
console.log(JSON.stringify(lengkap));
// Object.freeze di script biasa (sloppy mode): perubahan gagal senyap
const kuota = Object.freeze({ sisa: 5 });
kuota.sisa = 100;
console.log("Sisa kuota setelah dicoba diubah:", kuota.sisa);Output yang Dihasilkan:
[ 'Kopi Gayo', 'Teh Melati', 'Cokelat Bubuk' ]
[ 24, 31, 17 ]
[ [ 'Kopi Gayo', 24 ], [ 'Teh Melati', 31 ], [ 'Cokelat Bubuk', 17 ] ]
Total nilai stok: Rp2098000
{"Kopi Gayo":34,"Teh Melati":41,"Cokelat Bubuk":27}
{"toko":"Toko Sinar","status":"buka"}
Sisa kuota setelah dicoba diubah: 5Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 17–19 (
console.log(Object.keys(stok));dan seterusnya): tampilan tiga sudut pandang atas object yang sama. Perhatikan format entries: setiap pasangan[ 'Kopi Gayo', 24 ]adalah array dua elemen, dan ketiganya membentuk array induk. - Baris 22–26 (
let total = 0;sampai}):Object.keys(stok)menghasilkan array tiga nama produk. LoopformembacadaftarKunci[i], lalustok[...]danhargaSatuan[...]memakai nama itu sebagai bracket key untuk menghubungkan dua object. Hasilnya24 × 45000 + 31 × 12000 + 17 × 38000 = 2098000. - Baris 29–32 (
const stokBaru = Object.fromEntries(...)):entriesmengubah stok menjadi array pasangan;mapmembangun pasangan baru[nama, jumlah + 10]untuk tiap elemen (parameter function-nya didestructure, persis pola dari chapter Object Destructuring);fromEntriesmerakit pasangan-pasangan itu kembali menjadi object. Hasilnya stok baru yang tiap nilainya naik 10. - Baris 35–36 (
Object.assign({}, info, { status: "buka" })):assignmenyalin properti setiap sumber ke target — di sini object kosong{}— lalu mengembalikan target yang sudah terisi. Karena targetnya object baru,infotidak ikut berubah. - Baris 39–41 (
const kuota = Object.freeze(...)sampaiconsole.log(...)): assignmentkuota.sisa = 100dijalankan tanpa error apa pun, tetapi pembacaan berikutnya tetap menghasilkan5. Perilaku senyap ini wajar di script biasa — penjelasannya di bagian berikutnya.
Terakhir, Object.fromEntries adalah kebalikan langsung dari Object.entries: ia menerima array pasangan dan merakitnya menjadi object. Kombinasi keduanya membentuk “jalur pulang-pergi” yang sering dipakai untuk mentransformasi object — ubah object menjadi array pasangan, olah dengan method array, lalu rakit kembali menjadi object, seperti yang dilakukan stokBaru di berkas contoh.
Object.freeze dan Mode Ketat #
Object.freeze membuat object menjadi beku: propertinya tidak bisa diubah, ditambah, atau dihapus. Pemberlakuan ini tunduk pada mode eksekusi yang sudah kita pelajari di section Dasar Pemrograman:
- Di script biasa (sloppy mode), pelanggaran terjadi senyap: assignment diabaikan, tidak ada error, dan nilai lama bertahan — persis yang terjadi pada
kuotadi berkas contoh. - Di modul ES (
.mjs), yang otomatis berjalan dalam strict mode, pelanggaran yang sama menimbulkanTypeErroryang nyata.
Berkas berikut mengulang percobaannya di modul, dengan try-catch agar errornya tertangkap dan terbaca:
// uji-freeze.mjs
// Modul ES berjalan dalam strict mode: perubahan pada object beku menimbulkan TypeError.
const konfigurasi = Object.freeze({
host: "example.com",
port: 8080
});
console.log("Port awal:", konfigurasi.port);
try {
konfigurasi.port = 9090; // di strict mode: TypeError
console.log("Port setelah diubah:", konfigurasi.port);
} catch (error) {
console.log("Tertangkap:", error.name);
console.log("Pesan:", error.message);
}
console.log("Port akhir:", konfigurasi.port);Output yang Dihasilkan:
Port awal: 8080
Tertangkap: TypeError
Pesan: Cannot assign to read only property 'port' of object '#<Object>'
Port akhir: 8080Pesan Cannot assign to read only property 'port' menyebutkan penyebabnya secara eksplisit: properti port kini bersifat read-only karena object-nya beku. Jalankan berkas yang sama sebagai .js biasa, dan baris assignment itu berlalu tanpa suara. Mekanisme try-catch di atas adalah pratinjau kecil — pola lengkapnya menunggu section Error Handling.
Status beku sebuah object bisa diperiksa tanpa mencoba mengubahnya. Method Object.isFrozen menghasilkan true hanya untuk object yang memang sudah dibekukan:
const beku = Object.freeze({ a: 1 });
const bebas = { a: 1 };
console.log(Object.isFrozen(beku), Object.isFrozen(bebas));Output yang Dihasilkan:
true falseMethod ini berguna ketika object diterima dari tempat lain — fungsi, modul, atau bagian kode yang ditulis orang lain — dan kita perlu tahu dengan pasti apakah object itu masih boleh diubah.
Kapan freeze layak dipakai? Pada data yang harus dijamin tidak bergeser selama program berjalan: konfigurasi bawaan, konstanta domain seperti nilai pajak, atau tabel konversi yang dirujuk banyak function. Membekukan object semacam ini tidak menambah kecepatan apa pun — manfaatnya adalah jaminan: siapa pun yang tanpa sengaja menulis assignment ke object itu akan melihat TypeError di modul, bukan data yang diam-diam berganti.
const data = Object.freeze({ tag: ["arabika"] });
data.tag.push("kering");
console.log(data.tag);Output yang Dihasilkan:
[ 'arabika', 'kering' ]data.tag.push tidak mengubah properti tag milik object beku — ia mengubah isi array yang ditunjuk properti tersebut, dan array itu tidak ikut dibekukan. Bila seluruh struktur harus beku, setiap tingkat harus dibekukan satu per satu.
Chapter berikutnya mengambil sudut pandang lain dari “properti yang tidak ada”: bukan mengubahnya, melainkan mendeteksinya dengan aman.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
inventaris-toko.js
Unduh berkas// inventaris-toko.js
// Object.keys, Object.values, Object.entries, Object.assign, Object.fromEntries.
const stok = {
"Kopi Gayo": 24,
"Teh Melati": 31,
"Cokelat Bubuk": 17
};
const hargaSatuan = {
"Kopi Gayo": 45000,
"Teh Melati": 12000,
"Cokelat Bubuk": 38000
};
// tiga cara melihat isi object dari luar
console.log(Object.keys(stok));
console.log(Object.values(stok));
console.log(Object.entries(stok));
// keys sebagai penghubung dua object untuk menghitung nilai stok
let total = 0;
const daftarKunci = Object.keys(stok);
for (let i = 0; i < daftarKunci.length; i++) {
total += stok[daftarKunci[i]] * hargaSatuan[daftarKunci[i]];
}
console.log("Total nilai stok: Rp" + total);
// entries + map + fromEntries: menaikkan seluruh stok 10 unit
const stokBaru = Object.fromEntries(
Object.entries(stok).map(([nama, jumlah]) => [nama, jumlah + 10])
);
console.log(JSON.stringify(stokBaru));
// Object.assign dengan target kosong: menggabung tanpa mengubah object asal
const info = { toko: "Toko Sinar" };
const lengkap = Object.assign({}, info, { status: "buka" });
console.log(JSON.stringify(lengkap));
// Object.freeze di script biasa (sloppy mode): perubahan gagal senyap
const kuota = Object.freeze({ sisa: 5 });
kuota.sisa = 100;
console.log("Sisa kuota setelah dicoba diubah:", kuota.sisa);