dasartipe-dataobjectarrayPemula3 mnt baca

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:

javascript
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:

javascript
let buah = ["apel", "mangga", "jeruk"];
console.log(buah[0]); // "apel"
console.log(buah.length); // 3

Copy by value vs copy by reference

Ini konsep penting. Tipe primitif disalin nilainya, tipe referensi disalin alamatnya:

javascript
// 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):

javascript
let asli = [1, 2, 3];
let salinan = [...asli];
salinan.push(4);
console.log(asli); // [1, 2, 3] aman

Catatan 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:

javascript
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 sama

Analoginya: dua rumah kembar di alamat berbeda tetap dua rumah berbeda. Untuk membandingkan isi, bandingkan propertinya satu per satu atau pakai trik JSON:

javascript
console.log(JSON.stringify(a) === JSON.stringify(b)); // true

Trik 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.