Tipe Data Referensi: Object dan Array
Memahami object, array, dan perbedaan penting antara copy by value dan copy by reference.
Data yang lebih kompleks
Tipe primitif hanya menyimpan satu nilai. Untuk data kompleks, JavaScript punya tipe referensi: object, array, dan function. Mereka tidak menyimpan nilainya langsung, melainkan menyimpan alamat menuju nilai tersebut.
Object: pasangan kunci dan nilai
Object menyimpan data sebagai pasangan key dan value, cocok untuk merepresentasikan satu entitas:
let siswa = {
nama: "Rizky",
umur: 17,
kelas: "XII"
};
console.log(siswa.nama); // "Rizky"Array: daftar berurutan
Array menyimpan daftar nilai dalam urutan tertentu, diakses lewat index mulai dari 0:
let buah = ["apel", "mangga", "jeruk"];
console.log(buah[0]); // "apel"
console.log(buah.length); // 3Copy by value vs copy by reference
Ini konsep penting. Tipe primitif disalin nilainya, tipe referensi disalin alamatnya:
// primitif: salinan mandiri
let a = 10;
let b = a;
b = 20;
console.log(a); // tetap 10
// referensi: berbagi alamat yang sama
let arr1 = [1, 2, 3];
let arr2 = arr1;
arr2.push(4);
console.log(arr1); // [1, 2, 3, 4] ikut berubah!Analoginya: primitif seperti fotokopi dokumen, mengubah salinan tidak mengubah aslinya. Referensi seperti memberi dua orang kunci rumah yang sama, siapa pun yang mengubah isi rumah akan terlihat oleh keduanya.
Cara menyalin dengan benar
Untuk membuat salinan mandiri dari array atau object, gunakan spread operator (dibahas detail di modul tersendiri):
let asli = [1, 2, 3];
let salinan = [...asli];
salinan.push(4);
console.log(asli); // [1, 2, 3] amanCatatan teknis: Spread hanya menyalin satu level (shallow copy). Kalau array berisi object, object di dalamnya masih berbagi referensi. Untuk duplikasi total, pakai structuredClone() atau JSON.parse(JSON.stringify(obj)).
Membandingkan referensi
Operator === pada tipe referensi membandingkan alamat, bukan isi. Dua object dengan isi identik tetap dianggap beda kalau alamatnya beda:
let a = [1, 2, 3];
let b = [1, 2, 3];
console.log(a === b); // false! alamat berbeda
let c = a;
console.log(a === c); // true, alamat samaAnaloginya: dua rumah kembar di alamat berbeda tetap dua rumah berbeda. Untuk membandingkan isi, bandingkan propertinya satu per satu atau pakai trik JSON:
console.log(JSON.stringify(a) === JSON.stringify(b)); // trueTrik JSON ini cukup untuk kasus sederhana. Untuk object kompleks, library punya fungsi deep equal, atau tulis perbandingan manual untuk properti yang penting saja.
Kesimpulan
Pahami perbedaan value vs reference sejak awal. Bug paling membingungkan bagi pemula biasanya berasal dari sini: data berubah "sendiri" padahal yang diubah adalah variabel lain yang menunjuk ke alamat sama.