DEV Community

Hilman Apriadi
Hilman Apriadi

Posted on

Memahami Reference Object di JavaScript

Banyak bug aneh di JavaScript sebenarnya bukan karena syntax salah, tapi beberapa karena salah paham soal reference object.

Kalau pernah ngalamin:

  • Object ikut berubah padahal cuma assign ke variabel baru
  • Function "tiba‑tiba" mengubah data luar
  • Spread operator tapi data nested masih ikut berubah

Akar masalahnya cuma satu: reference.

Artikel ini ngebedah itu semua. Dan sebagai bagain dari dokumentasi saya belajar juga


1️⃣ Primitive vs Object

JavaScript punya 2 kategori tipe data.

Primitive (Value Type)

  • number
  • string
  • boolean
  • null
  • undefined
  • bigint
  • symbol

Primitive disimpan langsung sebagai nilai (by value).

let a = 10;
let b = a;

b = 20;

console.log(a); // 10
Enter fullscreen mode Exit fullscreen mode

Kenapa a tidak berubah?

Karena:

yang disalin adalah nilainya, bukan alamatnya.


Object (Reference Type)

  • object literal {}
  • array []
  • function
  • date
  • dll

Object tidak disimpan langsung.
Variabel hanya menyimpan alamat memory (reference).

let obj1 = { name: "Hilman" };
let obj2 = obj1;

obj2.name = "Apriadi";

console.log(obj1.name); // Apriadi
Enter fullscreen mode Exit fullscreen mode

Kenapa ikut berubah?

Karena obj1 dan obj2 menunjuk alamat yang sama.


2️⃣ Mental Model Memory (Stack vs Heap)

Cara paling gampang paham:

Primitive → Stack

Nilai langsung disimpan di variabel.

a → 10
Enter fullscreen mode Exit fullscreen mode

Object → Heap

Variabel cuma simpan alamat.

obj1 → 0x123
        { name: "Hilman" }
Enter fullscreen mode Exit fullscreen mode

Saat assign:

let obj2 = obj1;
Enter fullscreen mode Exit fullscreen mode

Yang disalin cuma alamatnya:

obj1 → 0x123
obj2 → 0x123
Enter fullscreen mode Exit fullscreen mode

Dua variabel, satu object.

Kalau satu diubah → semuanya ikut berubah.


3️⃣ Definisi Reference Object

Reference object adalah variabel yang menyimpan alamat memory, bukan isi object.

Artinya:

  • Assign ≠ copy
  • Assign = share alamat

4️⃣ Bug Paling Sering Terjadi

Case: Function mengubah data luar

function change(user) {
  user.name = "Altair";
}

let user = { name: "Hilman" };
change(user);

console.log(user.name); // Altair
Enter fullscreen mode Exit fullscreen mode

Kenapa?

Karena function menerima reference yang sama, bukan salinan.


Case: Spread tapi masih ikut berubah

let user = {
  name: "Hilman",
  address: { city: "Jakarta" }
};

let copy = { ...user };

copy.address.city = "Bandung";

console.log(user.address.city); // Bandung
Enter fullscreen mode Exit fullscreen mode

Kenapa masih berubah?

Karena spread hanya shallow copy.

Yang di-copy cuma level pertama.
Nested object tetap reference.


5️⃣ Shallow Copy vs Deep Copy

Shallow Copy

let copy = { ...obj };
Enter fullscreen mode Exit fullscreen mode

✔ copy properti level 1
❌ nested masih reference


Deep Copy (cara sederhana)

let copy = JSON.parse(JSON.stringify(obj));
Enter fullscreen mode Exit fullscreen mode

Benar-benar clone, tapi punya limit:

  • tidak support function
  • tidak support Date
  • tidak support Map/Set

6️⃣ Kenapa JavaScript Pakai Reference?

Bayangin object 10MB.

Kalau setiap assignment harus copy penuh:

let a = bigObject;
let b = a; // copy 10MB lagi
Enter fullscreen mode Exit fullscreen mode

Performa bakal hancur.

Solusinya: salin alamat saja.

Lebih cepat. Lebih hemat memory.

Ini desain bahasa, bukan bug.


7️⃣ Rule of Thumb

  • Primitive → aman
  • Object → hati‑hati (shared reference)
  • Butuh copy → clone
  • Nested → deep copy

Kalau data berubah tanpa sadar, 90% penyebabnya reference.

Terimakasih

Top comments (0)