Menu

Object di JavaScript: Property, Method, dan Cara Memakainya

Cara kerja object di JavaScript yang sebenarnya: membuatnya, membaca dan menulis property, menambahkan method, dan pola yang menjaga kode object tetap mudah dibaca.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Object adalah wadah berisi nilai bernama

Array mengelompokkan nilai berdasarkan posisi. Object mengelompokkannya berdasarkan nama. Kalau hal yang kamu modelkan punya bagian berlabel, misalnya user dengan nama dan umur, atau request dengan method dan URL, pakailah object.

Cara terpendek untuk membuatnya adalah object literal:

Setiap entri adalah pasangan key: value. Di balik layar, key berupa string (tanda kutip boleh tidak ditulis untuk identifier yang valid seperti name). Nilainya bisa apa saja yang bisa direpresentasikan JavaScript: angka, string, boolean, array, fungsi, bahkan object lain.

Koma di belakang entri terakhir tidak masalah. Kebanyakan tim membiarkannya, karena diff tetap bersih saat kamu menambah property baru nanti.

Membaca dan menulis property

Ada dua cara mengakses property: dot notation dan bracket notation.

Dot notation lebih rapi dan biasanya jadi pilihan utama. Bracket notation berguna saat key disimpan di variabel, atau saat key bukan identifier yang valid:

Membaca property yang tidak ada akan menghasilkan undefined, tanpa error:

Ini bisa diam-diam menutupi salah ketik. Kalau kamu ingin kegagalan yang jelas terlihat, kamu harus mengeceknya secara eksplisit.

Menambah dan menghapus property

Object selalu terbuka: kamu bisa menambah key kapan saja:

Dan menghapusnya dengan delete:

delete termasuk operator yang tidak kamu pakai setiap hari, tapi saat kamu perlu membuang sebuah key sepenuhnya (bukan sekadar mengisinya dengan undefined), inilah alat yang tepat. Mengisi user.email = undefined tetap menyisakan key-nya, jadi "email" in user masih bernilai true.

Mengecek apakah sebuah property ada

Ada tiga cara, masing-masing dengan arti yang sedikit berbeda:

  • in mengecek apakah key ada, termasuk yang diwariskan dari prototype chain.
  • Object.hasOwn(obj, key) hanya mengecek key milik object itu sendiri. Pakai ini kalau kamu ingin mengabaikan hal yang diwariskan. Ia menggantikan pemanggilan hasOwnProperty yang lebih lama.
  • obj.key !== undefined biasanya berhasil, tapi menipu saat sebuah property sengaja diisi undefined.

Pilih Object.hasOwn kalau kamu ragu: ia melakukan apa yang kemungkinan besar kamu maksud.

Method: fungsi yang tinggal di object

Property yang nilainya berupa fungsi disebut method. Ada sintaks singkat untuk mendefinisikannya di dalam object literal:

this di dalam method merujuk ke object tempat method itu dipanggil, dalam hal ini user. Begitulah greet tahu nama siapa yang dipakai.

Satu hal yang perlu diwaspadai: arrow function tidak punya this sendiri, jadi ia pilihan yang salah untuk method yang perlu membaca property lain dari object itu:

Pakai sintaks method singkat (greet() { ... }) untuk apa pun yang menyentuh this. Arrow function bagus untuk callback, bukan untuk method object.

Object bersarang

Nilai juga bisa berupa object, sedalam apa pun:

Membaca property bersarang dilakukan dengan merangkai akses: user.address.city. Masalahnya, kalau ada satu langkah di tengah jalan yang bernilai null atau undefined, kamu mendapat TypeError:

console.log(user.profile.city);
// TypeError: Cannot read properties of undefined (reading 'city')

Optional chaining (user.profile?.city) adalah solusi modernnya: ia mengembalikan undefined alih-alih melempar error saat ada mata rantai yang hilang. Ada halaman khusus tentang itu di bab ini nanti.

Melakukan perulangan pada object

Saat kamu perlu menelusuri setiap key dalam object, keluarga Object.keys, Object.values, dan Object.entries adalah yang kamu cari:

Object.entries yang paling berguna: ia memberimu key dan nilai sekaligus, dan cocok dipadukan dengan array destructuring.

Ada juga loop for...in, tapi ia ikut menelusuri property yang diwariskan, yang biasanya bukan yang kamu mau:

for (const key in scores) {
  console.log(key);  // works, but includes inherited keys
}

Utamakan Object.keys / Object.entries, kecuali kamu memang sengaja menginginkan property yang diwariskan.

Sintaks singkat yang perlu kamu tahu

Dua bentuk syntactic sugar yang akan kamu lihat di mana-mana:

Property shorthand berlaku saat nama variabel sama dengan key-nya. Computed key (bentuk [expr]) memungkinkanmu membuat nama property secara dinamis, berguna saat menulis fungsi yang mengubah sebuah field berdasarkan namanya.

Kesetaraan object dibandingkan lewat referensi

Hal ini pernah menjebak hampir semua orang:

=== pada object mengecek apakah kedua sisi merujuk ke object yang sama di memori, bukan apakah isinya sama. Dua object dengan property yang identik tetap dua object yang berbeda.

Untuk pertanyaan "apakah bentuk keduanya sama?", kamu harus membandingkan field satu per satu, atau memakai helper deep equality. JSON.stringify(a) === JSON.stringify(b) adalah cara cepat seadanya yang berhasil untuk data biasa, tapi gagal pada apa pun yang berisi fungsi, undefined, atau referensi melingkar.

Object tetap bisa diubah walau memakai const

const mengunci variabel ke satu nilai. Ia tidak membekukan object yang ditunjuk oleh nilai itu:

Kalau kamu benar-benar ingin data yang tidak bisa diubah, Object.freeze(user) mencegah perubahan selanjutnya (secara dangkal: object bersarang tetap bisa diubah). Dalam praktiknya, kebanyakan kode lebih mengandalkan kesepakatan daripada Object.freeze: anggap object const sebagai "jangan assign ulang binding ini" dan tangani imutabilitas di tingkat desain.

Berikutnya: array

Object dan array adalah dua balok bangunan yang menjadi dasar segala hal lainnya. Object menangani data berlabel; array menangani data berurutan. Selanjutnya: cara kerja array di JavaScript, dan segelintir method (push, slice, map, dan kawan-kawannya) yang mengerjakan sebagian besar pekerjaan berat.

Pertanyaan yang sering diajukan

Bagaimana cara membuat object di JavaScript?

Cara yang biasa adalah object literal: const user = { name: 'Ada', age: 30 }. Kurung kurawal berisi pasangan key-value yang dipisahkan koma. Key berupa string (tanda kutip boleh tidak ditulis untuk identifier yang valid), dan nilainya bisa apa saja: angka, string, array, fungsi, atau object lain.

Apa bedanya dot notation dan bracket notation?

user.name dan user['name'] melakukan hal yang sama kalau key-nya identifier yang sudah diketahui. Pakai kurung siku kalau key disimpan di variabel (user[key]), berisi karakter yang tidak bisa dibaca dot notation (spasi, tanda hubung), atau diawali angka. Untuk selebihnya, dot notation lebih rapi.

Bagaimana cara mengecek apakah sebuah property ada di object?

Pakai 'name' in user untuk mengecek key-nya, termasuk yang diwariskan. Pakai Object.hasOwn(user, 'name') untuk mengecek property milik object itu sendiri saja; ini pengganti modern untuk hasOwnProperty. Mengecek user.name !== undefined juga bisa, tapi hasilnya menipu kalau property itu sengaja diisi undefined.

Bagaimana cara melakukan perulangan pada object di JavaScript?

for (const key in obj) menelusuri key, termasuk yang diwariskan. Yang lebih umum, pakai Object.keys(obj), Object.values(obj), atau Object.entries(obj) bersama for...of atau .forEach(). Object.entries praktis saat kamu butuh key dan nilainya dalam satu putaran.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai